[英]Find documents that contain certain field for sub-object MongoDb and Node.js
[英]Find documents where certain field has exact same elements as object in MongoDB and Node.js
我有一个像这样的 id 数组:
[5, 7, 9, 4, 18]
我有一个包含以下格式插入的文档的集合:
db.collection('groups').insert(
[
{
members: [
{member: 5, hasSeen: false, requiresAction: true},
{member: 7, hasSeen: true, requiresAction: true},
{member: 4, hasSeen: false, requiresAction: false}
]
},
{
members: [
{member: 5, hasSeen: false, requiresAction: true},
{member: 4, hasSeen: false, requiresAction: false},
{member: 7, hasSeen: true, requiresAction: true},
{member: 9, hasSeen: false, requiresAction: false},
{member: 18, hasSeen: false, requiresAction: false}
]
},
{
members: [
{member: 7, hasSeen: true, requiresAction: true},
{member: 9, hasSeen: false, requiresAction: false},
{member: 4, hasSeen: false, requiresAction: false},
{member: 18, hasSeen: false, requiresAction: false},
{member: 1, hasSeen: false, requiresAction: false},
{member: 5, hasSeen: false, requiresAction: true}
]
}
]
);
我想找到在包含上述阵列中只有“会员” IDS集“组”的所有文件,并且为了不应该的事。 例如,如果使用上述数组进行搜索,则只会从上面返回第二个插入的文档。
您需要使用MongoDB 的聚合管道来查找所需的文档。
下面列出了聚合中要采用的步骤:
通过解构members
数组对每个文档进行非规范化。
这可以通过使用$unwind聚合运算符来实现:
从输入文档中解构一个数组字段,为每个元素输出一个文档。 每个输出文档都是输入文档,其中数组字段的值被元素替换。
$unwind
运算符将每个文档拆分为多个,每个新文档包含一个members
字段,该字段具有单个成员对象:
{_id: 'first_id', members: {member: 4, hasSeen: false}} {_id: 'first_id', members: {member: 5, hasSeen: fasee}}
要使用$unwind
运算符,我们只需将其添加到聚合管道中:
{$unwind: "$members"}
按_id
字段对文档进行分组,将成员 ID 添加到数组中
这可以通过使用$group聚合运算符来实现:
按某些指定的表达式对文档进行分组,并将每个不同分组的文档输出到下一阶段。 输出文档包含一个 _id 字段,其中包含不同的 group by key。 输出文档还可以包含计算字段,这些字段保存按 $group 的 _id 字段分组的某些累加器表达式的值。
$group
运算符允许我们在累积成员 id 的同时按 id 对非规范化文档进行分组,因此我们将获得这种形式的文档:
{_id: 'first_id', member_ids: [5, 7, 4] }
对文档进行分组并累积 id 所需的表达式为:
{$group: { _id: "$_id", member_ids: { $push: "$members.member" } }}
根据定义的标准过滤生成的文档
这可以通过使用$match聚合运算符来实现:
过滤文档以仅将符合指定条件的文档传递到下一个管道阶段。
要获取其member_ids
属性匹配条件的文档,表达式为:
{$match: {'member_ids': { $all: [5, 7, 9, 4, 18] } } }
最终的聚合查询将是:
db.collection('groups').aggregate(
[
{$unwind: "$members"},
{$group: {
_id: "$_id",
member_ids: { $push: "$members.member" }
}},
{$match: {'member_ids': { $all: [5, 7, 9, 4, 18] } } }
]
);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.