具有键值数组计数的Mongodb嵌套数组组

具有键值数组计数的Mongodb嵌套数组组,mongodb,mongodb-query,aggregation-framework,Mongodb,Mongodb Query,Aggregation Framework,我有如下mongodb结构: { "_id":"123456789", "name":"item name 1", "variants":[ { "size":"150 ml", "filters":[ {"name":"filter 1", "value":"value 1"}, {"name":"filter 2", "value":"value 2"} ] } ] }, { "_id":"987654321", "n

我有如下mongodb结构:

{
"_id":"123456789",
"name":"item name 1",
"variants":[
    {
    "size":"150 ml",
    "filters":[

    {"name":"filter 1",
    "value":"value 1"},
    {"name":"filter 2",
     "value":"value 2"}
  ]
   } 
]
},

{
"_id":"987654321",
"name":"item name 1",
"variants":[
    {
    "size":"200 ml",
    "filters":[

    {"name":"filter 1",
    "value":"value 2"},
    {"name":"filter 2",
     "value":"value 1"}
  ]
   } 
]
}
现在,我需要按名称和值分组的筛选器计数。 i、 e

如何使用mongodb聚合和组查询实现此目的?

您可以尝试以下方法:

db.collection.aggregate([
    { $unwind: "$variants" },
    { $unwind: "$variants.filters" },
    { $group:
        {
            _id: "$variants.filters",
            count:{$sum:1}
        }
    },
    { $addFields: {"name" : "$_id.name", "value" : "$_id.value"}},
    { $project: {_id: 0} }
]);
例如。

您可以尝试以下方法:

db.collection.aggregate([
    { $unwind: "$variants" },
    { $unwind: "$variants.filters" },
    { $group:
        {
            _id: "$variants.filters",
            count:{$sum:1}
        }
    },
    { $addFields: {"name" : "$_id.name", "value" : "$_id.value"}},
    { $project: {_id: 0} }
]);

一个在.

上的工作示例,它有多个字段分组,就像你的问题一样。看到这个,它有多个字段分组,就像你的问题一样。最后一个阶段{$project:{{u id:0}}可以被删除,{u id:0可以投影到addFields阶段本身。@prasad\,在这种情况下,如果我将_id:0放在addfields级别,则为0.0。@MihirShah您是对的。将$addFields和$project替换为:{$project:{name:$\u id.name,value:$\u id.value,count:1,{u id:0}}。@MihirShah有额外的阶段有时可能会导致性能问题,尤其是当文档数量很大时。因此,这是一个很好的做法,可以避免这些情况。最后一个阶段{$project:{{u id:0}}可以被删除,并且{u id:0可以投影到addFields阶段本身。@prasad!。将$addFields和$project替换为:{$project:{name:$\u id.name,value:$\u id.value,count:1,{u id:0}}。@MihirShah有额外的阶段有时可能会导致性能问题,尤其是当文档数量很大时。所以,这只是一个很好的做法,以避免这些总是。
db.collection.aggregate([
    { $unwind: "$variants" },
    { $unwind: "$variants.filters" },
    { $group:
        {
            _id: "$variants.filters",
            count:{$sum:1}
        }
    },
    { $addFields: {"name" : "$_id.name", "value" : "$_id.value"}},
    { $project: {_id: 0} }
]);