2011-12-08 16 views
1

$push修飾子を使用した後に新しいインデックスを取得して新しい値を配列に挿入するにはどうすればよいですか?プッシュ後にインデックスを取得

例えば、私は、ドキュメント内の配列を持ってプッシュした後

{ ... 
    'myarray': [1, 2, 3] 
.... 
} 

myarrayで数10を言って、私は使用にcount方法を考えていますが、考えてインデックス番号3.

取得したいですそれは原子ではないでしょう。

+0

配列のすべての要素が一意であるか重複する可能性がありますか? –

+0

一意または重複することができます。 – bxx

答えて

1

アトミックではありません。このような何かを行うための最善の方法は、findAndModifyを使用することです:

http://www.mongodb.org/display/DOCS/findAndModify+Command

はここでアトミック$プッシュアップデートを適用し、結果のドキュメントを返す例です。 findAndModifyコールは、プッシュが適用された「新しい」ドキュメントを返します。これは原子です。

MongoDB shell version: 2.1.0 
connecting to: test 
> db.z.save({"a":[], "name": "list1"}) 
> db.runCommand({ "findAndModify": "z", "query": { "name": "list1" }, "update": { "$push": { "a": 64 } }, "new": true }) 
{ 
     "lastErrorObject" : { 
       "updatedExisting" : true, 
       "n" : 1, 
       "connectionId" : 65, 
       "err" : null, 
       "ok" : 1 
     }, 
     "value" : { 
       "_id" : ObjectId("4ee27202c469f4b2d3c6cbf9"), 
       "a" : [ 
         64 
       ], 
       "name" : "list1" 
     }, 
     "ok" : 1 
} 
> db.z.find() 
{ "_id" : ObjectId("4ee27202c469f4b2d3c6cbf9"), "a" : [ 64 ], "name" : "list1" } 

次に、クライアントコードでインデックスを計算します。後続の操作では、このインデックスを無効にすることがあります(つまり、その後の削除、$セット、または$プル)。このケースの処理はアプリケーションによって異なります。

関連する問題