javascript - 从 MongoDB 中的嵌套数组中查找公共(public)属性

标签 javascript node.js mongodb

下面是我的架构:

  [{
    "attributes":[
        {
            "attrId":"123",
            "values":[
                    {"name": "asd"},
                    {"name": "bcc"}
                ]
        },
        {
            "attrId":"456",
            "values":[
                    {"name": "zzz"},
                    {"name": "bcc"}
                ]
        }
        ]
},

{
    "attributes":[
        {
            "attrId":"123",
            "values":[
                    {"name": "asd"},
                    {"name": "bcc"}
                ]
        },
        {
            "attrId":"456",
            "values":[
                    {"name": "kkk"},
                    {"name": "bcc"}
                ]
        }
        ]
}]

我希望输出为:

[{123:["asd","ccc"]}]

即返回 attrId 和值,如果所有值都与所有其他文档匹配, 我正在考虑将值转换为字符串,如“asdbcc”,以便于比较。

最佳答案

你可以试试,

  • $group 由 null 组成根对象数组并获取根中对象的总数
  • $unwind 解构我们在上面阶段创建的 root 数组
  • $unwind 解构root.attributes数组
  • $group 通过 root.attributes.attrIdroot.attributes.values 并获取分组文档的总数和值以获得 k (key) 作为 attrId 和 v(value) 作为 values 对象的值数组,使用 $map 并获取第一个 totalCount字段
  • $match expression using $expr 检查公共(public)文档计数和总根对象文档是否相等然后返回匹配文档
  • $replaceRootvalues 数组的 $arraToObject 转换后替换对象
db.collection.aggregate([
  {
    $group: {
      _id: null,
      root: { $push: "$$ROOT" },
      totalCount: { $sum: 1 }
    }
  },
  { $unwind: "$root" },
  { $unwind: "$root.attributes" },
  {
    $group: {
      _id: {
        attrId: "$root.attributes.attrId",
        values: "$root.attributes.values"
      },
      values: {
        $addToSet: {
          k: "$root.attributes.attrId",
          v: {
            $map: {
              input: "$root.attributes.values",
              in: "$$this.name"
            }
          }
        }
      },
      count: { $sum: 1 },
      totalCount: { $first: "$totalCount" }
    }
  },
  { $match: { $expr: { $eq: ["$count", "$totalCount"] } } },
  { $replaceRoot: { newRoot: { $arrayToObject: "$values" } } }
])

Playground

关于javascript - 从 MongoDB 中的嵌套数组中查找公共(public)属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64661342/

相关文章:

arrays - 如何检查数组中的所有值是否都是相同的 mongodb 聚合?

node.js - 在 NPM 启动时下载模块

node.js - SocketIo 和 Redis 多重发射处理

node.js - 通过 Mongoose 使用 req.body 更新和/或添加数组元素属性?

javascript - 使用 ibm_db 模块在 Node JS 中执行准备好的语句时出现问题

javascript - CSS 或 JQuery 中的特定图像扩展选择器

javascript - 如何在 Handlebars 模板上下文中传递 JQuery 实例?

javascript - 字符串中包含的以 10 为基数的大数字的最佳压缩

javascript - Express js 4,Parse.com JSON 错误

node.js - 如何使用包含数据库创建的 dockerfile 构建 docker 镜像