javascript - 查找某些字段与 MongoDB 和 Node.js 中的对象具有完全相同元素的文档

标签 javascript node.js mongodb express

我有一个像这样的 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找到所需的文档。

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

  1. 通过解构 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"}
    
  2. _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" } }}
    
  3. 根据定义的标准过滤结果文档

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

相关文章:

node.js - PrintToPDF 无法在 headless Chrome 60 中工作

c# - 使用 SimpleMembership/Sql Server CE、MongoDB 管理用户配置文件

java - 在elastic或mongodb中存储128位数字

javascript - 使用纯 javascript 的随机背景颜色生成器(无 jquery)

javascript - 当鼠标进入时,Angular bootstrap popover 消失

javascript - 如何将函数应用于页面上的所有 div

java - 如何处理从 HTML 收集的日期并保存在 MongoDB 中

javascript - 减少使用NodeJ复制文件夹的时间

node.js - 在 TypeScript 中导入 Node 模块

node.js - 如何将 http 代理与 node.js https 一起使用?