残念ながら、現在、あなたが説明したようにこれを正確に行う方法はありません。
Chris Shainが指摘したように、https: //jira.mongodb.org/browse/SERVER-2191-「$ push()を配列の前に」および同様にhttps://jira.mongodb.org/browse/SERVER-1824-「特定の配列インデックスへの挿入のサポート」が役立ちますが、これらの機能は現在、特定のリリースバージョンで予定されていません。
考えられる回避策として、「lastElement」(または同等のもの)という名前のフィールドをドキュメントに追加できます。このフィールドには、配列にプッシュされた最後の要素のコピーが含まれています。次に、updateステートメントで、「lastElement」値に対してクエリを実行し、一致する場合は、同時に新しい値に設定し、同じ値を1回の不可分操作で配列にプッシュします。
例えば:
> db.blogposts.save({_id:5, comments:[{by: "Abe", text:"First"}], lastElement:{by: "Abe", text:"First"}})
> db.blogposts.find().pretty()
{
"_id" : 5,
"comments" : [
{
"by" : "Abe",
"text" : "First"
}
],
"lastElement" : {
"by" : "Abe",
"text" : "First"
}
}
> db.blogposts.update({"lastElement.text":"First"}, {$set:{lastElement:{by: "Joe", text:"Second"}}, $push:{comments:{by: "Joe", text:"Second"}}})
> db.blogposts.find().pretty()
{
"_id" : 5,
"comments" : [
{
"by" : "Abe",
"text" : "First"
},
{
"by" : "Joe",
"text" : "Second"
}
],
"lastElement" : {
"by" : "Joe",
"text" : "Second"
}
}
>
別の方法として、「AtomicOperations」ドキュメントの「UpdateifCurrent」セクションで概説されている戦略を検討することもできます:http ://www.mongodb.org/display/DOCS/Atomic+Operations
これらは回避策であり、理想的な解決策ではないことを理解しています。うまくいけば、上記があなたの目標を達成するのに役立つか、少なくともあなたが別の解決策を考え出すための思考の糧を提供するでしょう。もしそうなら、ここでそれを共有してください。そうすれば、同様の問題を経験しているかもしれないコミュニティのメンバーがあなたの経験の利益を得ることができます。ありがとう。