mongodb中的过滤器阵列
我有一个集合,其中每个文档包含2个文档数组,如下所示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
{
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);
})