我有db喜欢;
{"_id" : 1 , children: ["2", "123", "5"]}
我想在children数组中插入一个元素。当你知道索引时很容易。 $ position可用于此目的。等;
db.module_menu.update({"_id" : "1"} ,
{$push : {"children" : {
$each : ["12"] , $position : 1}}});
但是让我说我不知道位置索引,我知道我想要插入的元素的值。
我有value: 12
和我想要插入的值。 insertAfter: 2
结果应该是;
{"_id" : 1, text: "" , children: ["2","12", "123", "5"]}
我该怎么办?
遍历children数组中的每个元素,找到value的索引,并使用$ position,插入值。这是唯一的方法吗?
答案 0 :(得分:1)
我担心这是不可能的。使用$function
in update是一个古老的问题,但您只能阅读,修改和保留数组。
另一方面,如果你有一系列嵌入式文档,那么你可以使用$
positional operator。
$
可用于$set
简单数组中的值,但可用于$push
。
> db.test.find()
{ "_id" : ObjectId("56d9570d09e01f20e254d0f3"), "a" : [ 1, 2, 3 ] }
> db.test.update({"_id": ObjectId("56d9570d09e01f20e254d0f3"), "a": 2},
{$push: {a: {$each: [2], $position: "$"}}})
WriteResult({
"nMatched" : 0,
"nUpserted" : 0,
"nModified" : 0,
"writeError" : {
"code" : 2,
"errmsg" : "The value for $position must be a positive numeric value not a String"
}
})
答案 1 :(得分:0)
没有任何功能可以一次获得位置和更新, 所以在你的问题中,你需要在更新前获得位置并将其传递给查询 - 这意味着我们在1:1的贝司上操作。
其他方法是检索数据 - 执行就地更新并将完整数组设置回mongo