MongoDb 在 $group 内聚合使用 $sortByCount
MongoDb aggregate use $sortByCount inside a $group
我正在尝试使用 mongoDb 聚合数据以收集每个用户的数据。我有以下查询:
DB.collection.aggregate([
{ "$facet": {
"instructions": [
{ $match: { company: ref } },
{ $group: {
_id : '$user._id',
firstName: { $first: "$user.firstName"},
lastName: { $last: "$user.lastName"},
total: { $sum: 1 },
completed: { $sum: {
"$cond": [
{ "$eq": [ "$completed.value", true ] },
1, 0
]}
},
mostPopularProduct: {
$sortByCount: "$productType"
},
mostPopularType: {
$sortByCount: "$instructionType"
}
}},
]
}},
{ "$project": {
"perClient": { "instructions": "$instructions" }
}}
}}
])
我正在尝试从所有与 $match
匹配的文档中的字符串字段中获取我的集合中的 mostPopularProduct
(和 mostPopularInstruction
)。基本上是所有文档中出现最多的产品。组内还有一些计算。
目前,我收到以下错误:"unknown group operator '$sortByCount'"
。现在我知道这是因为它正在组内使用,而它不能。但我不确定如何达到预期的结果。我尝试使用 $sum
,但没有达到我想要的效果。不知道是不是我用错了
有人能给我指出正确的方向吗?
编辑
好的,所以我可能对我想要的东西有点含糊。让我澄清一下。
我以前用过$sortByCount
,像这样:
"mostPopularProduct": [
{ $match: { company: ref } },
{ $sortByCount: "$productType"}
],
我得到的结果是:
"mostPopularProduct": [
{
"_id": "car",
"count": 14
}, {
"_id": "house",
"count": 2
}
]
现在,我想做完全相同的事情,但我希望它在我的组内,所以基本上我想得到以下结果:
"perClient": {
"instructions": [
{
"_id": "5fd3db7427e9bc610e4daeaa",
"firstName": "firstName",
"lastName": "lastName",
"total": 8,
"completed": 1,
// NOW HERE ARE THE FIELDS I WANT
"mostPopularProduct": [
{
"_id": "car",
"count": 3
}
]
}, // all other clients follow
]
}
这是我试图通过 $group 内的 $sortByCount 实现的所需结果。
示例文档:
[
{ userId: 1, productType: "car" },
{ userId: 1, productType: "car" },
{ userId: 1, productType: "bus" },
{ userId: 1, productType: "bus" },
{ userId: 2, productType: "bus" },
{ userId: 2, productType: "bus" }
]
$group
由 userId
和 productType
计算总和
$group
by only userId
并准备 productType
和 count 的数组
db.collection.aggregate([
{
"$facet": {
"instructions": [
{
$group: {
_id: {
userId: "$userId",
productType: "$productType"
},
productTypeCount: { $sum: 1 }
}
},
{
$group: {
_id: "$_id.userId",
mostPopularProduct: {
$push: {
_id: "$_id.productType",
count: "$productTypeCount"
}
}
}
}
]
}
}
])
我正在尝试使用 mongoDb 聚合数据以收集每个用户的数据。我有以下查询:
DB.collection.aggregate([
{ "$facet": {
"instructions": [
{ $match: { company: ref } },
{ $group: {
_id : '$user._id',
firstName: { $first: "$user.firstName"},
lastName: { $last: "$user.lastName"},
total: { $sum: 1 },
completed: { $sum: {
"$cond": [
{ "$eq": [ "$completed.value", true ] },
1, 0
]}
},
mostPopularProduct: {
$sortByCount: "$productType"
},
mostPopularType: {
$sortByCount: "$instructionType"
}
}},
]
}},
{ "$project": {
"perClient": { "instructions": "$instructions" }
}}
}}
])
我正在尝试从所有与 $match
匹配的文档中的字符串字段中获取我的集合中的 mostPopularProduct
(和 mostPopularInstruction
)。基本上是所有文档中出现最多的产品。组内还有一些计算。
目前,我收到以下错误:"unknown group operator '$sortByCount'"
。现在我知道这是因为它正在组内使用,而它不能。但我不确定如何达到预期的结果。我尝试使用 $sum
,但没有达到我想要的效果。不知道是不是我用错了
有人能给我指出正确的方向吗?
编辑
好的,所以我可能对我想要的东西有点含糊。让我澄清一下。
我以前用过$sortByCount
,像这样:
"mostPopularProduct": [
{ $match: { company: ref } },
{ $sortByCount: "$productType"}
],
我得到的结果是:
"mostPopularProduct": [
{
"_id": "car",
"count": 14
}, {
"_id": "house",
"count": 2
}
]
现在,我想做完全相同的事情,但我希望它在我的组内,所以基本上我想得到以下结果:
"perClient": {
"instructions": [
{
"_id": "5fd3db7427e9bc610e4daeaa",
"firstName": "firstName",
"lastName": "lastName",
"total": 8,
"completed": 1,
// NOW HERE ARE THE FIELDS I WANT
"mostPopularProduct": [
{
"_id": "car",
"count": 3
}
]
}, // all other clients follow
]
}
这是我试图通过 $group 内的 $sortByCount 实现的所需结果。
示例文档:
[
{ userId: 1, productType: "car" },
{ userId: 1, productType: "car" },
{ userId: 1, productType: "bus" },
{ userId: 1, productType: "bus" },
{ userId: 2, productType: "bus" },
{ userId: 2, productType: "bus" }
]
$group
由userId
和productType
计算总和$group
by onlyuserId
并准备productType
和 count 的数组
db.collection.aggregate([
{
"$facet": {
"instructions": [
{
$group: {
_id: {
userId: "$userId",
productType: "$productType"
},
productTypeCount: { $sum: 1 }
}
},
{
$group: {
_id: "$_id.userId",
mostPopularProduct: {
$push: {
_id: "$_id.productType",
count: "$productTypeCount"
}
}
}
}
]
}
}
])