在问这个问题之前,我已阅读以下关于 SO 的帖子:
但无法找出解决方案。
我有这个数据:
[
{
"_id": ObjectId("63ad7cea911abe16a7e75df3"),
"number": "1726218093",
"status_id": ObjectId("922a3bda863a4445182aeb33")
...
},
{
"_id": ObjectId("a12f7cea911abe16a7e71e3a"),
"number": "17182180342",
"status_id": ObjectId("bda863a4445182aeb33922a3")
...
},
{
"_id": ObjectId("63adb3a7cea911abe16a7e75"),
"number": "1735218032",
"status_id": ObjectId("63a4445182aeb3da83922a3b")
...
},
{
"_id": ObjectId("ea911abe16a7e75df363ad7c"),
"number": "1722218087",
"status_id": ObjectId("182aeb3392263a4445a3bda8")
...
}
...
]
我想按状态对数据进行分组,并根据状态的特定条件对其进行汇总。这是预期的结果:
[
{
"IN_AUCTION": 6546,
"PROCESSING": 569,
"DELIVERING": 124,
"OTHERS": 68798
}
]
条件:
“IN_AUCTION”包括以下状态:
["63a4445182aeb3da83922a3b", "ea911abe16a7e75df363ad7c"]
“处理中”包括以下状态:
["8e63a4445182aeb3da83922a", "5c63adea911abe16a7e75df3"]
“其他”包括所有剩余状态
首先我将它们分组:
{
_id: "$status_id",
count: {$count: {}}
}
之后,我又尝试了一次
$group
。但没有达到预期的结果。
然后我尝试了
$addFields
:
{
"in_auction": {
$cond: [
{
"$in": ["$_id", [ObjectId('63a432fc82aeb33922a3b8a0'),ObjectId('63a442c782aeb33922a3bd44')]]
},
0,
{$add: "$count"}
]
}
}
$addFields
似乎适用于文档本身。
我也阅读了
$ROOT
,但无法使用它。
怎样才能得到我想要的结果?如有任何帮助,我们将不胜感激。
$set
- 使用 status field
运算符设置 $switch
以相应地分配值。
$group
- 按 status
分组并执行计数。
$group
- 将所有文档归为一个。并在 k
数组中添加具有 v
和 data
属性的文档。
$replaceRoot
- 通过将 data
数组转换为键值对来替换输出文档。
db.collection.aggregate([
{
$set: {
status: {
$switch: {
branches: [
{
case: {
$in: [
"$status_id",
[
ObjectId("63a4445182aeb3da83922a3b"),
ObjectId("ea911abe16a7e75df363ad7c")
]
]
},
then: "IN_AUCTION"
},
{
case: {
$in: [
"$status_id",
[
ObjectId("8e63a4445182aeb3da83922a"),
ObjectId("5c63adea911abe16a7e75df3")
]
]
},
then: "PROCESSING"
}
],
default: "OTHERS"
}
}
}
},
{
$group: {
_id: "$status",
count: {
$count: {}
}
}
},
{
$group: {
_id: null,
data: {
$push: {
k: "$_id",
v: "$count"
}
}
}
},
{
$replaceRoot: {
newRoot: {
$arrayToObject: "$data"
}
}
}
])