为了账号安全,请及时绑定邮箱和手机立即绑定

从 MongoDB 中的嵌套数组中查找公共属性

从 MongoDB 中的嵌套数组中查找公共属性

肥皂起泡泡 2023-07-06 17:32:16
下面是我的架构:  [{    "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”这样的字符串,以便于比较。
查看完整描述

1 回答

?
Smart猫小萌

TA贡献1911条经验 获得超7个赞

你可以试试,

  • $groupby null 并创建根对象数组并获取根中对象的总数

  • $unwind解构root我们在上面阶段创建的数组

  • $unwind解构root.attributes数组

  • $group通过root.attributes.attrId和获取分组文档和值的总数,以使用对象中的值数组形式root.attributes.values获取 k(key)attrId和 v(value)并获取第一个字段values$maptotalCount

  • $match使用$expr检查公共文档计数和总根对象文档的表达式都相等,然后返回匹配的文档

  • $replaceRoot$arraToObject从ofvalues数组转换后替换 and 对象

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" } } }

])


查看完整回答
反对 回复 2023-07-06
  • 1 回答
  • 0 关注
  • 110 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信