0

一度に複数のサブドキュメントの更新クエリを作成したいと考えています。すべてのサブドキュメントのステータスをパッシブに設定し、クエリで指定した条件を満たします。

db.deduplications.update(  
{ $and: [ 
    { "_id": "189546D623FC69E3B693FDB679DBC76C" }, 
    { "DeviceVersionPairs.DeviceId": ObjectId("5822d0606bfdcd6ec407d9b9") }, 
    { "DeviceVersionPairs.CloudFolderId": ObjectId("5823110e6bfdd46ec4357582") },
    { "DeviceVersionPairs.CloudFileId": ObjectId("582311168cd396223499942a") },
    { "DeviceVersionPairs.VersionId": ObjectId("582311168cd396223499942b") }
] },
{ $set: { "DeviceVersionPairs.$.Status": "passive" }});

上記のクエリは、サブドキュメントを 1 つだけ見つけて、必要に応じて更新します。しかし;

db.deduplications.update(  
{ $or: [ { $and: [ 
        { "_id": "189546D623FC69E3B693FDB679DBC76C" }, 
        { "DeviceVersionPairs.DeviceId": ObjectId("5822d0606bfdcd6ec407d9b9") }, 
        { "DeviceVersionPairs.CloudFolderId": ObjectId("5823110e6bfdd46ec4357582") },
        { "DeviceVersionPairs.CloudFileId": ObjectId("582311168cd396223499942a") },
        { "DeviceVersionPairs.VersionId": ObjectId("582311168cd396223499942b") }
    ] } ,   
    { $and: [ 
        { "_id": "189546D623FC69E3B693FDB679DBC76C" }, 
        { "DeviceVersionPairs.DeviceId": ObjectId("56dfe1356caaea14a819f1e4") }, 
        { "DeviceVersionPairs.CloudFolderId": ObjectId("583fb4bc6e7f341874f13bfc") }, 
        { "DeviceVersionPairs.CloudFileId": ObjectId("583fb539e015b8a53fb71872") }, 
        { "DeviceVersionPairs.VersionId": ObjectId("583fb4ca6e7f331874213584") }
    ] } ] },
{ $set: { "DeviceVersionPairs.$.Status": "passive" }});

クエリ セグメントに or を入力し、他の項目を追加すると、エラーが発生します。

WriteResult({
    "nMatched" : 0,
    "nUpserted" : 0,
    "nModified" : 0,
    "writeError" : {
        "code" : 16837,
        "errmsg" : "The positional operator did not find the match needed from the query. Unexpanded update: DeviceVersionPairs.$.Status"
    }
})

ここで何が欠けていますか?

4

5 に答える 5

0

以下のクエリを実行しました。そして、それは素晴らしい働きをしています。

db.mm.update( { $or: [ {$and: [{"_id": ObjectId("581d18d41b6c5c752f11c87a")}] }, 
                       {$and: [{"_id": ObjectId("581a1a671b6c5c752f11c87b")}] } 
               ] 
          }, {$set : {"name": "abc3"}});

最初のドキュメントが見つからない場合、2 番目のドキュメントが更新されます。そして、最初のものが見つかった場合、最初のものだけを更新しています。

あなたの質問でそれを見ることができます -> Error message it is shown "nMatched" : 0. ドキュメントが見つかりません。すべての ID と参照 ID を確認します。

于 2016-12-01T08:56:48.610 に答える
0

配列フィルターが役立つかどうかを確認してください

db.deduplications.updateMany(
{ $or: [ { $and: [ 
        { "_id": "189546D623FC69E3B693FDB679DBC76C" }, 
        { "DeviceVersionPairs.DeviceId": ObjectId("5822d0606bfdcd6ec407d9b9") }, 
        { "DeviceVersionPairs.CloudFolderId": ObjectId("5823110e6bfdd46ec4357582") },
        { "DeviceVersionPairs.CloudFileId": ObjectId("582311168cd396223499942a") },
        { "DeviceVersionPairs.VersionId": ObjectId("582311168cd396223499942b") }
    ] } ,   
    { $and: [ 
        { "_id": "189546D623FC69E3B693FDB679DBC76C" }, 
        { "DeviceVersionPairs.DeviceId": ObjectId("56dfe1356caaea14a819f1e4") }, 
        { "DeviceVersionPairs.CloudFolderId": ObjectId("583fb4bc6e7f341874f13bfc") }, 
        { "DeviceVersionPairs.CloudFileId": ObjectId("583fb539e015b8a53fb71872") }, 
        { "DeviceVersionPairs.VersionId": ObjectId("583fb4ca6e7f331874213584") }
    ] } ] },


     { $set: {
         "DeviceVersionPairs.index.Status": "passive" ,
       }
     },
    { 
    arrayFilters: [ 
            { $or: [ { $and: [ 
        { "index.DeviceId": ObjectId("5822d0606bfdcd6ec407d9b9") }, 
        { "index.CloudFolderId": ObjectId("5823110e6bfdd46ec4357582") },
        { "index.CloudFileId": ObjectId("582311168cd396223499942a") },
        { "index.VersionId": ObjectId("582311168cd396223499942b") }
    ] } ,   
    { $and: [ 
        { "index.DeviceId": ObjectId("56dfe1356caaea14a819f1e4") }, 
        { "index.CloudFolderId": ObjectId("583fb4bc6e7f341874f13bfc") }, 
        { "index.CloudFileId": ObjectId("583fb539e015b8a53fb71872") }, 
        { "index.VersionId": ObjectId("583fb4ca6e7f331874213584") }
    ] } ] }
          ]
    ,"multi":true, new:true
    },

    function (err, out) {
         //
    });
于 2020-08-31T07:04:12.997 に答える