mongodb中的过滤器阵列

mongodb中的过滤器阵列,mongodb,mongodb-query,aggregation-framework,Mongodb,Mongodb Query,Aggregation Framework,我有一个集合,其中每个文档包含2个文档数组,如下所示 { all_users:[ { id:1, name:"A" }, { id:2, name:"B" }, { id:3, name:"C" } ] selected_users:[ { id:1, name:"A

我有一个集合,其中每个文档包含2个文档数组,如下所示

{
  all_users:[
    {
      id:1,
      name:"A"
    },
    {
      id:2,
      name:"B"
    },
    {
      id:3,
      name:"C"
    }
  ]
  selected_users:[
    {
     id:1,
      name:"A"
    },
    {
      id:2,
      name:"B"
    }
  ]
}
是否可以通过添加一个字段
selected
并根据
selected\u users
数组中的文档中是否存在用户名为其赋值来合并这两个数组,如下所示

{
  all_users:[
    {
      id:1,
      name:"A",
      selected:"yes"
    },
    {
      id:2,
      name:"B",
      selected:"yes"
    },
    {
      id:3,
      name:"C",
      selected:"no"
    }
  ]
}

我想通过
id
name
进行检查,因为文档可能包含其他字段。我不知道如何实现这一点。

  • $map
    迭代
    所有用户的循环
    数组
  • $cond
    如果
    id
    在所选用户
    id
    中,则检查条件,然后在
    所选
    字段中返回“是”,否则返回“否”
  • $mergeObject
    将当前用户对象与上面选择的
    字段合并

如果您使用的是Robo Mongo 3T,您可以使用JavaScript,因此您可以执行以下操作:

db.collection.find({}).forEach(doc => {
    doc.all_users.map(au => {
        const su = doc.selected_users.find(su => su.id === au.id);
        au.selected = su === undefined; 
    });
    delete doc.selected_users;
    db.collection.save(doc);
 })

我建议您事先创建收藏的备份。:)

谢谢大家!!它起作用了。如果我必须投射,比如说,仅投射
名称
选定的
字段,那么必须进行哪些更改?您只需返回所需的字段,请参阅
db.collection.find({}).forEach(doc => {
    doc.all_users.map(au => {
        const su = doc.selected_users.find(su => su.id === au.id);
        au.selected = su === undefined; 
    });
    delete doc.selected_users;
    db.collection.save(doc);
 })