44

mongo $push を実行するときに、最後に追加するのではなく、セットの最初にプッシュを追加したいと考えています。

要素を最後ではなく最初に追加するアトミック プッシュ アップデートを行うことは可能ですか?


2014 更新:はい、できます。

4

3 に答える 3

33

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

于 2013-11-13T06:13:41.237 に答える
29

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 ] }
于 2013-03-09T06:14:32.933 に答える
5

同様の質問が数日前に尋ねられました。残念ながら、短い答えは「いいえ」ですが、この機能に対するオープン リクエストがあります。
https://jira.mongodb.org/browse/SERVER-2191 - 「アレイの前に $push()」

他のスレッドには、いくつかの詳細情報と考えられる回避策があります。「MongoDB 配列をスタックとして使用する」 - MongoDB 配列をスタックとして使用する

上記が役に立ち、許容できる回避策を見つけるのに役立つことを願っています。

于 2012-04-12T21:27:53.190 に答える