从 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”这样的字符串,以便于比较。


肥皂起泡泡
浏览 112回答 1
1回答

Smart猫小萌

你可以试试,$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" } } }])
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript