MongoDB在相同索引处查询两个输入数组?

时间:2018-11-27 21:53:51

标签: mongodb

我有两个由输入定义的长度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_idsfruit_names但在相同索引处指定的特定farm_id中提取项目,

例如,对于上述输入,我希望farm_id: 3344 {name: "Orange", id:"id1"}被删除。

任何人都可以帮助我。

2 个答案:

答案 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 } }}
)