我有两个由输入定义的长度n
的数组A和B,
fruit_ids = [{id: "id1"}, {id: "id2"}, {id:"id3"}];
fruit_names = [{name: "Orange"},{name: "Kiwi"},{name: "Banana"}]
和MongoDB文档
{ farm_id: "3344", fruits: [{name: "Orange", id:"id1"}, {name: "Kiwi", id:"id67"}]}
现在,我想编写一个Mongo查询,以使其从数组fruit_ids
和fruit_names
但在相同索引处指定的特定farm_id中提取项目,
例如,对于上述输入,我希望farm_id: 3344
{name: "Orange", id:"id1"}
被删除。
任何人都可以帮助我。
答案 0 :(得分:1)
您可以使用$pullAll运算符删除所有匹配的元素,并使用以下代码动态构建更新语句:
var fruit_ids = [{id: "id1"}, {id: "id2"}, {id:"id3"}];
var fruit_names = [{name: "Orange"},{name: "Apple"},{name: "Banana"}];
var pullAll = {
$pullAll: { fruits: fruit_ids.map((id, index) => Object.assign(fruit_names[index], id)) }
}
db.col.update({ farm_id: 3344 }, pullAll)
这只会尝试更新farm_id: 3344
。
答案 1 :(得分:0)
我尝试使用@mickl在他的回答中建议的$pullAll
,但事实是我的嵌入文档中还有其他字段,并且因为$pullAll
仅适用于完全匹配,这就是为什么我目前在嵌入式文档数组上使用$pull
和$or
的原因。我从这个答案how-to-force-mongodb-pullall-to-disregard-document-order找到了这个解决方案。
let arr = [{name: "Orange", id:"id1"}, {name: "Kiwi", id:"id67"}];
db.col.update(
{ farm_id: 3344 },
{ "$pull": { "fruits": { "$or": arr } }}
)