sql >> データベース >  >> NoSQL >> MongoDB

MongoDBは配列エラーのすべてのフィールドを更新します

    編集

    質問に欠けている詳細は、更新に必要なフィールドが実際にはサブドキュメントにあるということでした。 。これにより、答えが大幅に変わります:

    これは、おそらくできることの制約です。 配列要素の更新を行います。そして、これはドキュメント で明確に説明されています。 。主にこの段落で:

    だからここにあるのです。 すべてを更新しようとしています このような単一のステートメント内の配列要素の数はありません 仕事。これを行うには、次のことを行う必要があります。

    db.warehouses.find({ "items.qty": { "$gt": 0 } }).forEach(function(doc) {
        doc.items.forEach(function(item) {
            item.qty = 0;
        });
        db.warehouses.update({ "_id": doc._id }, doc );
    })
    

    これは基本的にすべてを更新する方法です 配列要素。

    マルチ .update()での設定 複数の「ドキュメント」にまたがることを意味します。 できません 配列の複数の要素に適用されます。したがって、現時点で最良のオプションは、すべてを置き換えることです。または、この場合、全体を置き換えることもできます とにかくそれをする必要があるので文書化してください。

    本物の場合 バルクデータの場合は、 db.eval()を使用します 。ただし、お読みください 最初のドキュメント:

    db.eval(function() {
        db.warehouses.find({ "items.qty": { "$gt": 0 } }).forEach(function(doc) {
            doc.items.forEach(function(item) {
                item.qty = 0;
            });
            db.warehouses.update({ "_id": doc._id }, doc );
        });
    })
    

    すべてを更新しています 全体全体の配列内の要素 コレクションは単純ではありません。

    オリジナル

    エラーの内容とほぼ同じです。位置演算子を使用するには、一致する必要があります 最初に何か。のように:

    db.warehouses.update(
        // query 
        {
            _id:ObjectId('5322f07e139cdd7e31178b78'),
            "items.qty": { "$gt": 0 }
        },    
        // update 
        {
            $set:{"items.$.qty":0}
        },    
        // options 
        {
            "multi" : true,  
            "upsert" : true  
        }
    );
    

    つまり、一致 条件は位置をフィンします 未満のアイテムの 0次にそのインデックス 位置演算子に渡されます。

    P.S ムティの場合 true すべて更新されることを意味します 資料。 falseのままにします 1つだけを意味する場合 。これがデフォルトです。



    1. mongodbの集計リクエストで日付で並べ替え

    2. エラー:ホスト'localhost:27017'でコマンド'saslStart'を実行しようとしたときにネットワークエラーが発生しました

    3. mongoコレクションのデータの断片化

    4. Mongo DBエラー:無効な演算子:$text検索を実行するときの$search