我想一次对多个子文档进行更新查询。在满足我查询条件的情况下,我将所有子文档状态设置为被动。
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" }});
上面的查询恰好找到一个子文档,然后根据需要进行更新。但;
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"
}
})
我在这里想念什么?
您收到此错误
位置运算符未从查询中找到所需的匹配项
因为您的第二个查询与多个子文档匹配。当前,无法使用位置运算符使用位置运算符来更新数组中的所有项目。
因此,要解决您的问题,您可以按照以下步骤进行
使用_id查找文档,并使用$ elemMatch查找子文档,然后
更新每个子文档并再次保存文档
可以这样尝试:
db.deduplications.find(
{ $or: [ {
"_id": ObjectId("583fc558668bde730a460e11") ,
"DeviceVersionPairs":{
$elemMatch:{ "DeviceId": ObjectId("5822d0606bfdcd6ec407d9b9") ,
"CloudFolderId": ObjectId("5823110e6bfdd46ec4357582") ,
"DeviceVersionPairs.CloudFileId": ObjectId("582311168cd396223499942a") ,
"DeviceVersionPairs.VersionId": ObjectId("582311168cd396223499942b") }}
} ,
{
"_id": ObjectId("583fc558668bde730a460e11") ,
"DeviceVersionPairs":{
$elemMatch:{ "DeviceId": ObjectId("56dfe1356caaea14a819f1e4") ,
"CloudFolderId": ObjectId("583fb4bc6e7f341874f13bfc") ,
"CloudFileId": ObjectId("583fb539e015b8a53fb71872") ,
"VersionId": ObjectId("583fb4ca6e7f331874213584") }}
} ]
}).forEach(function (doc) {
doc.DeviceVersionPairs.forEach(function (device) {
device.status = 'passive';
});
db.deduplications.save(doc);
});
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句