2011-06-20 92 views
11

Mongo支持文档内的文档数组。例如,像插入到Mongo数组的特定索引

{_id: 10, "coll": [1, 2, 3] } 

现在,想象我想在任意索引

{_id: 10, "coll": [1, {name: 'new val'}, 2, 3] } 

我知道你可以更新的地方以$ $设置,但没有对值插入任意值插入。它只是为了插入特定索引而不得不替换整个数组。

回答

16

版本2.6你终于可以开始做这个。您必须使用$position运算符。举个例子:

db.students.update(
    { _id: 10}, 
    { $push: { 
    coll: { 
     $each: [ {name: 'new val'} ], 
     $position: 1 
    } 
    }} 
) 
+0

没有'$ each,$ position'不起作用 –

0

关于你的评论:

嗯..这个将是与任何数据库问题的并发用户......

我会做的是: 添加最后修改的时戳的文件。加载文档,让用户修改它,并在更新文档时使用timstamp作为过滤器,并在一步中更新时间戳。如果它更新了0个文档,您知道它在此期间已被修改,您可以要求用户重新加载它。

1

下面将做的伎俩:

var insertPosition = 1; 
var newItem = {name: 'new val'}; 

db.myCollection.find({_id: 10}).forEach(function(item) 
{ 
    item.coll = item.coll.slice(0, insertPosition).concat(newItem, item.coll.slice(insertPosition)); 
    db.myCollection.save(item); 
}); 

如果insertPosition是可变的(也就是说,你不知道到底要插入它,但你知道你想要的物品后,将其插入与name = "foo",只需添加一个for()环路item.coll =分配之前找到insertPosition(并把它加1,因为你要插入之后name = "foo"

0

使用$ position操作符可以从版本2.5.3开始。

它必须与$ each操作符一起使用。从the documentation

db.collection.update(<query>, 
        { $push: { 
           <field>: { 
             $each: [ <value1>, <value2>, ... ], 
             $position: <num> 
           } 
          } 
        } 
       ) 
1

便捷回答这个类似的帖子(不选择答案,但最高评级): Can you have mongo $push prepend instead of append?

利用$设置在数组中第一个位置插入3,所谓的“阵列” 。来自Sergey Nikitin的相关答案的示例:

db.test.update({"_id" : ObjectId("513ad0f8afdfe1e6736e49eb")}, 
       {'$set': {'array.-1':  3}})