positional $
>
<で使用される演算子code> findAndModify()
方法。演算子は、配列内の要素の位置を明示的に指定せずに、更新する配列内の要素を識別します。配列フィールドはクエリドキュメントの一部として表示される必要があり、更新時に行われた変更を含むドキュメントを返すには、新しいオプションを使用する必要があるため、更新は次のようになります
db.tests.findAndModify({
query: {
"arr.cond": 4
},
update: {
"$set": {"arr.$.upd": 55 }
},
new : true,
fields: { "arr": 1, "_id": 0 }
})
出力を生成します:
{
"arr": [
{
"cond" : 1,
"upd" : 2
},
{
"cond" : 2,
"upd" : 3
},
{
"cond" : 4,
"upd" : 55
},
{
"cond" : 6,
"upd" : 7
},
{
"cond" : 8,
"upd" : 9
}
]
}
更新されたドキュメントを返したいので、プロジェクションを使用して、位置 $プロジェクション
演算子は、 find()
の投影ドキュメントでのみ使用できます メソッドまたはfindOne()
メソッドなので、 findAndModify()
のフィールド
オプションは、 $プロジェクション
オペレーター。
回避策は、ネイティブJavaScriptを使用することです filter()
返されたarrフィールドのメソッド
var result = db.tests.findAndModify({
query: {
"arr.cond": 4
},
update: {
"$set": {"arr.$.upd": 55 }
},
new : true,
fields: { "arr": 1, "_id": 0 }
})
var updated = []
if (result && result.arr) updated = result.arr.filter(function (item) { return item.cond == 4; });
printjson(updated);
これで印刷されます
[ { "cond" : 4, "upd" : 55 } ]
-更新 -
または、 $ elemMatch
以下のコメントで提案したように、投影:
var result = db.tests.findAndModify({
query: {
"arr.cond": 4
},
update: {
"$set": {"arr.$.upd": 55 }
},
new : true,
fields: {"arr": {"$elemMatch": { "cond": 4 } }, "_id": 0 }
})
printjson(result);
出力 :
{ "arr" : [ { "cond" : 4, "upd" : 55 } ] }