我有一个像这样的 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}
]
}
]
);
我想查找集合“组”中仅包含上述数组中“成员”ID 的所有文档,并且顺序不应该重要。例如,如果使用上面的数组进行搜索,则上面仅会返回第二个插入的文档。
最佳答案
您需要使用 MongoDB's aggregation pipeline找到所需的文档。
下面列出了聚合中要采用的步骤:
通过解构
members
对每个文档进行非规范化数组。这可以通过使用 $unwind 来实现 聚合运算符:
Deconstructs an array field from the input documents to output a document for each element. Each output document is the input document with the value of the array field replaced by the element.
$unwind
运算符会将每个文档分成几个,每个新文档包含members
具有单个成员对象的字段:{_id: 'first_id', members: {member: 4, hasSeen: false}} {_id: 'first_id', members: {member: 5, hasSeen: fasee}}
要使用
$unwind
运算符,我们只需将其添加到聚合管道中即可:{$unwind: "$members"}
按
_id
对文档进行分组字段,将成员 ID 添加到数组这可以通过使用 $group 来实现聚合运算符:
Groups documents by some specified expression and outputs to the next stage a document for each distinct grouping. The output documents contain an _id field which contains the distinct group by key. The output documents can also contain computed fields that hold the values of some accumulator expression grouped by the $group‘s _id field.
$group
运算符将允许我们按 id 对非规范化文档进行分组,同时累积成员 id,因此我们将获得以下形式的文档:{_id: 'first_id', member_ids: [5, 7, 4] }
对文档进行分组并累积 id 所需的表达式为:
{$group: { _id: "$_id", member_ids: { $push: "$members.member" } }}
根据定义的标准过滤结果文档
这可以通过使用 $match 来实现聚合运算符:
Filters the documents to pass only the documents that match the specified condition(s) to the next pipeline stage.
获取
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] } } }
]
);
关于javascript - 查找某些字段与 MongoDB 和 Node.js 中的对象具有完全相同元素的文档,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36319439/