mongo $push を実行するときに、最後に追加するのではなく、セットの最初にプッシュを追加したいと考えています。
要素を最後ではなく最初に追加するアトミック プッシュ アップデートを行うことは可能ですか?
2014 更新:はい、できます。
MongoDB v2.5.3 の時点で、値を挿入する配列内の位置を指定するクエリの一部として演算子$position
と共に含めることができる新しい演算子があります。$each
$push
以下は、配列インデックス 2 に要素 20 と 30 を追加するドキュメント ページの例です。
db.students.update( { _id: 1 },
{ $push: { scores: {
$each: [ 20, 30 ],
$position: 2
}
}
}
)
参照: http://docs.mongodb.org/master/reference/operator/update/position/#up._S_position
mongo v2.2 でテストされた、プリペンドに $set で負のインデックスを使用します。
> db.test.insert({'array': [4, 5, 6]})
> db.test.find()
{ "_id" : ObjectId("513ad0f8afdfe1e6736e49eb"),
"array" : [ 4, 5, 6 ] }
//prepend 3
> db.test.update({"_id" : ObjectId("513ad0f8afdfe1e6736e49eb")},
{'$set': {'array.-1': 3}})
> db.test.find()
{ "_id" : ObjectId("513ad0f8afdfe1e6736e49eb"),
"array" : [ 3, 4, 5, 6 ] }
//prepend 2
> db.test.update({"_id" : ObjectId("513ad0f8afdfe1e6736e49eb")},
{'$set': {'array.-1': 2}})
> db.test.find()
{ "_id" : ObjectId("513ad0f8afdfe1e6736e49eb"),
"array" : [ 2, 3, 4, 5, 6 ] }
//prepend 1
> db.test.update({"_id" : ObjectId("513ad0f8afdfe1e6736e49eb")},
{'$set': {'array.-1': 1}})
> db.test.find()
{ "_id" : ObjectId("513ad0f8afdfe1e6736e49eb"),
"array" : [ 1, 2, 3, 4, 5, 6 ] }
同様の質問が数日前に尋ねられました。残念ながら、短い答えは「いいえ」ですが、この機能に対するオープン リクエストがあります。
https://jira.mongodb.org/browse/SERVER-2191 - 「アレイの前に $push()」
他のスレッドには、いくつかの詳細情報と考えられる回避策があります。「MongoDB 配列をスタックとして使用する」 - MongoDB 配列をスタックとして使用する
上記が役に立ち、許容できる回避策を見つけるのに役立つことを願っています。