Mongo支持文档内的文档数组。例如,像插入到Mongo数组的特定索引
{_id: 10, "coll": [1, 2, 3] }
现在,想象我想在任意索引
{_id: 10, "coll": [1, {name: 'new val'}, 2, 3] }
我知道你可以更新的地方以$ $设置,但没有对值插入任意值插入。它只是为了插入特定索引而不得不替换整个数组。
Mongo支持文档内的文档数组。例如,像插入到Mongo数组的特定索引
{_id: 10, "coll": [1, 2, 3] }
现在,想象我想在任意索引
{_id: 10, "coll": [1, {name: 'new val'}, 2, 3] }
我知道你可以更新的地方以$ $设置,但没有对值插入任意值插入。它只是为了插入特定索引而不得不替换整个数组。
与版本2.6你终于可以开始做这个。您必须使用$position运算符。举个例子:
db.students.update(
{ _id: 10},
{ $push: {
coll: {
$each: [ {name: 'new val'} ],
$position: 1
}
}}
)
关于你的评论:
嗯..这个将是与任何数据库问题的并发用户......
我会做的是: 添加最后修改的时戳的文件。加载文档,让用户修改它,并在更新文档时使用timstamp作为过滤器,并在一步中更新时间戳。如果它更新了0个文档,您知道它在此期间已被修改,您可以要求用户重新加载它。
下面将做的伎俩:
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"
。
使用$ position操作符可以从版本2.5.3开始。
它必须与$ each操作符一起使用。从the documentation:
db.collection.update(<query>,
{ $push: {
<field>: {
$each: [ <value1>, <value2>, ... ],
$position: <num>
}
}
}
)
便捷回答这个类似的帖子(不选择答案,但最高评级): Can you have mongo $push prepend instead of append?
利用$设置在数组中第一个位置插入3,所谓的“阵列” 。来自Sergey Nikitin的相关答案的示例:
db.test.update({"_id" : ObjectId("513ad0f8afdfe1e6736e49eb")},
{'$set': {'array.-1': 3}})
没有'$ each,$ position'不起作用 –