MongoDB 3.0以降を使用している場合は、.findOneAndUpdate()
を使用する必要があります projection
を使用します 返すフィールドのサブセットを指定するオプション。 returnNewDocument
も設定する必要があります true
に 。もちろん、$elemMatch
を使用する必要があります 位置射影を使用して新しいドキュメントを返すことはできないため、ここでは射影演算子を使用します。
誰かが指摘したように:
.findOneAndUpdate()
を使用する必要があります.findAndModify()
のため すべての公用語ドライバーで非推奨としてハイライトされています。もう1つは、構文とオプションが.findOneAndUpdate()
のドライバー間でかなり一貫していることです。 。.findAndModify()
を使用 、ほとんどのドライバは、「query / update/fields」キーで同じ単一のオブジェクトを使用しません。したがって、誰かが一貫性を保つために別の言語に適用する場合は、少し混乱が少なくなります。.findOneAndUpdate()
の標準化されたAPIの変更 実際には、3.2.xではなくサーバーリリース3.xに対応しています。完全な違いは、シェルメソッドが実際に他のドライバーよりも遅れていることです(一度だけ!)。そのため、ほとんどのドライバーには、実際には、そのような変更を加えた3.xリリースに対応するメジャーリリースバンプがありました。
db.collection.findOneAndUpdate(
{
"_id": ObjectId("56d6a7292c06e85687f44541"),
"rankings._id" : ObjectId("46d6a7292c06e85687f55543")
},
{ $inc : { "rankings.$.score" : 1 } },
{
"projection": {
"rankings": {
"$elemMatch": { "_id" : ObjectId("46d6a7292c06e85687f55543") }
}
},
"returnNewDocument": true
}
)
MongoDB 3.0以降では、findAndModify
を使用する必要があります およびfields
オプションもnew
を設定する必要があります true
に 他の場合は、新しい値を返します。
db.collection.findAndModify({
query: {
"_id": ObjectId("56d6a7292c06e85687f44541"),
"rankings._id" : ObjectId("46d6a7292c06e85687f55543")
},
update: { $inc : { "rankings.$.score" : 1 } },
new: true,
fields: {
"rankings": {
"$elemMatch": { "_id" : ObjectId("46d6a7292c06e85687f55543") }
}
}
})
どちらのクエリでも次の結果が得られます:
{
"_id" : ObjectId("56d6a7292c06e85687f44541"),
"rankings" : [
{
"_id" : ObjectId("46d6a7292c06e85687f55543"),
"name" : "Ranking 2",
"score" : 11
}
]
}