代码之家  ›  专栏  ›  技术社区  ›  Sudhanshu Gaur

MongoDB查询同一索引下的两个输入数组?

  •  1
  • Sudhanshu Gaur  · 技术社区  · 6 年前

    我有两个长度为A和B的数组 n 由输入定义,

    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查询,这样它就可以从数组中指定的特定farm\u id中提取项目。 fruit_ids fruit_names 但在同一个指数上,

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

    有人能帮我吗?

    2 回复  |  直到 6 年前
        1
  •  1
  •   mickl    6 年前

    你可以使用 $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 .

        2
  •  0
  •   Sudhanshu Gaur    6 年前

    我在尝试 $pullAll 正如@mickl在回答中建议的那样,但问题是我在嵌入的文档中还有其他字段,而且 美元普拉尔 仅用于 精确匹配 ,这就是我目前使用的 $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 } }}
    )