使用 mongodb 聚合框架计算数组中的项目出现次数
Count item occurrences in an array with mongodb aggregation framework
我在一个使用 express 和 mongodb 的项目中工作(我使用的是 mongoose),我有一个具有以下结构的集合:
[
{
"_id": "5e4a39f01ab49e48d4db5b9c",
"last": {
"winningNumbers": {
"list": [
66,
71,
62,
50,
29,
67,
74,
43,
22,
1,
11,
3,
80,
17,
57,
53,
30,
19,
76,
40
],
"bonus": [
40
]
}
}
},
{
"_id": "5e4a3b1c1ab49e48d4db5cb8",
"last": {
"winningNumbers": {
"list": [
71,
46,
79,
60,
1,
14,
19,
73,
34,
55,
5,
65,
12,
47,
16,
62,
51,
53,
3,
45
],
"bonus": [
45
]
}
}
}
]
我尝试使用 mongodb 聚合框架来计算整个集合中 last.winningNumber.list 数组中每个数字的出现次数,但我没有实现。
我想要如下所示的输出:
{
"occurrences": [
{number:1,count:3},
{number:2,count:8},
{number:12,count:15},
...
{number:78,count:55},
]
}
有什么方法可以使用 $group 实现吗?还是我应该使用不同的东西?
谢谢!
$group 是实现这个的方法,但是你必须先 $unwind 你的数组。
db.collection.aggregate([
{
$project: {
"last.winningNumbers.list": 1
}
},
{
$unwind: "$last.winningNumbers.list"
},
{
$group: {
_id: "$last.winningNumbers.list",
count: {
$sum: 1
}
}
}
])
注意:第一个 $project 阶段不是强制性的,没有它会产生完全相同的结果。
但是,我强烈建议保留它,因为展开/分组可能是昂贵的操作。 (它将为每个数组元素生成一个文档)。
我在一个使用 express 和 mongodb 的项目中工作(我使用的是 mongoose),我有一个具有以下结构的集合:
[
{
"_id": "5e4a39f01ab49e48d4db5b9c",
"last": {
"winningNumbers": {
"list": [
66,
71,
62,
50,
29,
67,
74,
43,
22,
1,
11,
3,
80,
17,
57,
53,
30,
19,
76,
40
],
"bonus": [
40
]
}
}
},
{
"_id": "5e4a3b1c1ab49e48d4db5cb8",
"last": {
"winningNumbers": {
"list": [
71,
46,
79,
60,
1,
14,
19,
73,
34,
55,
5,
65,
12,
47,
16,
62,
51,
53,
3,
45
],
"bonus": [
45
]
}
}
}
]
我尝试使用 mongodb 聚合框架来计算整个集合中 last.winningNumber.list 数组中每个数字的出现次数,但我没有实现。
我想要如下所示的输出:
{
"occurrences": [
{number:1,count:3},
{number:2,count:8},
{number:12,count:15},
...
{number:78,count:55},
]
}
有什么方法可以使用 $group 实现吗?还是我应该使用不同的东西?
谢谢!
$group 是实现这个的方法,但是你必须先 $unwind 你的数组。
db.collection.aggregate([
{
$project: {
"last.winningNumbers.list": 1
}
},
{
$unwind: "$last.winningNumbers.list"
},
{
$group: {
_id: "$last.winningNumbers.list",
count: {
$sum: 1
}
}
}
])
注意:第一个 $project 阶段不是强制性的,没有它会产生完全相同的结果。 但是,我强烈建议保留它,因为展开/分组可能是昂贵的操作。 (它将为每个数组元素生成一个文档)。