Mongodb 根据数组字段按计数分组
Mongodb Group by count Based on Array fields
我有以下数据。我想按数组中的字段分组。
{
"_id" : ObjectId("54e73137758646882f445383"),
"items" : [
{
"name" : "one",
"quality" : "high"
},
{
"name" : "one",
"quality" : "low"
},
{
"name" : "two",
"quality" : "high"
}
]
}
/* 1 */
{
"_id" : ObjectId("54e73166758646882f445384"),
"items" : [
{
"name" : "two",
"quality" : "high"
},
{
"name" : "three",
"quality" : "low"
},
{
"name" : "four",
"quality" : "medium"
}
]
}
我想按名称和质量分组,我想计数。
这是我试过的
db.testColl.aggregate( {$group : {
_id : {itemsName : "$items.name" ,itemsQuality : "$items.quality" },
count : {$sum : 1}
}})
我得到的结果像
{
"result" : [
{
"_id" : {
"itemsName" : [
"two",
"three",
"four"
],
"itemsQuality" : [
"high",
"low",
"medium"
]
},
"count" : 1
},
{
"_id" : {
"itemsName" : [
"one",
"one",
"two"
],
"itemsQuality" : [
"high",
"low",
"medium"
]
},
"count" : 1
}
],
"ok" : 1
}
预期结果:
{
"result" : [
{
"_id" : {
"itemsName" : one,
"itemsQuality" : high
},
"count" : 1
},
{
"_id" : {
"itemsName" : one,
"itemsQuality" : low
},
"count" : 1
},
{
"_id" : {
"itemsName" : two,
"itemsQuality" : high
},
"count" : 2
},
....
],
"ok" : 1
}
可能吗?如果是这样,请帮助我这样做?
如果不可能,请更正我的结构以获得结果。
试试这个会解决你的问题
db.collectionName.aggregate({
"$unwind": "$items"
}, {
"$group": {
"_id": {
"itemsName": "$items.name",
"itemsQuality": "$items.quality"
},
"count": {
"$sum": 1
}
}
})
我有以下数据。我想按数组中的字段分组。
{
"_id" : ObjectId("54e73137758646882f445383"),
"items" : [
{
"name" : "one",
"quality" : "high"
},
{
"name" : "one",
"quality" : "low"
},
{
"name" : "two",
"quality" : "high"
}
]
}
/* 1 */
{
"_id" : ObjectId("54e73166758646882f445384"),
"items" : [
{
"name" : "two",
"quality" : "high"
},
{
"name" : "three",
"quality" : "low"
},
{
"name" : "four",
"quality" : "medium"
}
]
}
我想按名称和质量分组,我想计数。
这是我试过的
db.testColl.aggregate( {$group : {
_id : {itemsName : "$items.name" ,itemsQuality : "$items.quality" },
count : {$sum : 1}
}})
我得到的结果像
{
"result" : [
{
"_id" : {
"itemsName" : [
"two",
"three",
"four"
],
"itemsQuality" : [
"high",
"low",
"medium"
]
},
"count" : 1
},
{
"_id" : {
"itemsName" : [
"one",
"one",
"two"
],
"itemsQuality" : [
"high",
"low",
"medium"
]
},
"count" : 1
}
],
"ok" : 1
}
预期结果:
{
"result" : [
{
"_id" : {
"itemsName" : one,
"itemsQuality" : high
},
"count" : 1
},
{
"_id" : {
"itemsName" : one,
"itemsQuality" : low
},
"count" : 1
},
{
"_id" : {
"itemsName" : two,
"itemsQuality" : high
},
"count" : 2
},
....
],
"ok" : 1
}
可能吗?如果是这样,请帮助我这样做? 如果不可能,请更正我的结构以获得结果。
试试这个会解决你的问题
db.collectionName.aggregate({
"$unwind": "$items"
}, {
"$group": {
"_id": {
"itemsName": "$items.name",
"itemsQuality": "$items.quality"
},
"count": {
"$sum": 1
}
}
})