Mongo支持在文档中嵌套文档数组。例如,类似于
{_id: 10, "coll": [1, 2, 3] }
现在,想象一下我想要在任意位置插入任意值
{_id: 10, "coll": [1, {name: 'new val'}, 2, 3] }
我知道你可以使用$和$set来原地更新值,但是没有插入的方法。这让在特定索引处插入元素时必须替换整个数组感觉有些糟糕。
Mongo支持在文档中嵌套文档数组。例如,类似于
{_id: 10, "coll": [1, 2, 3] }
现在,想象一下我想要在任意位置插入任意值
{_id: 10, "coll": [1, {name: 'new val'}, 2, 3] }
我知道你可以使用$和$set来原地更新值,但是没有插入的方法。这让在特定索引处插入元素时必须替换整个数组感觉有些糟糕。
从2.6版本开始,您终于可以做到这一点。您需要使用$position运算符。对于您的特定示例:
db.students.update(
{ _id: 10},
{ $push: {
coll: {
$each: [ {name: 'new val'} ],
$position: 1
}
}}
)
以下是类似帖子中最有用的答案(不是被选中的答案,但评分最高):
你能否在Mongo中使用$push前缀而不是后缀?使用$set将3插入到名为“array”的数组的第一个位置。以下是Sergey Nikitin相关答案的示例:
db.test.update({"_id" : ObjectId("513ad0f8afdfe1e6736e49eb")},
{'$set': {'array.-1': 3}})
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"
的项目后插入它),只需在item.coll =
赋值之前添加一个for()
循环来查找insertPosition(并将其加1,因为您想在name = "foo"
之后插入它。db.collection.update( <query>,
{ $push: {
<field>: {
$each: [ <value1>, <value2>, ... ],
$position: <num>
}
}
}
)