2011-12-08 26 views
1

如何使用$push修饰符将新索引推入数组?推后获取索引

例如,我有一个文档的数组,

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

推后说,在myarray 10号,希望得到索引号3

我想使用count方法,但认为它不会是原子的。

+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" } 

然后,您将计算客户端代码中的索引。请注意,后续操作可能会导致此索引无效(即后续移除,$ set或$ pull) - 处理此案例取决于您的应用程序。