繁体   English   中英

查找某些字段与 MongoDB 和 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 的聚合管道来查找所需的文档。

下面列出了聚合中要采用的步骤:

  1. 通过解构members数组对每个文档进行非规范化。

    这可以通过使用$unwind聚合运算符来实现:

    从输入文档中解构一个数组字段,为每个元素输出一个文档。 每个输出文档都是输入文档,其中数组字段的值被元素替换。

    $unwind运算符将每个文档拆分为多个,每个新文档包含一个members字段,该字段具有单个成员对象:

     {_id: 'first_id', members: {member: 4, hasSeen: false}} {_id: 'first_id', members: {member: 5, hasSeen: fasee}}

    要使用$unwind运算符,我们只需将其添加到聚合管道中:

     {$unwind: "$members"}
  2. _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" } }}
  3. 根据定义的标准过滤生成的文档

    这可以通过使用$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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM