以下是我正在处理的示例数据:
{
"_id": 1,
"user": A,
"nums":[1,2,3,4]
}
{
"_id": 2,
"user": B,
"nums":[1,2,4]
}
{
"_id": 3,
"user": B,
"nums":[4,5,7]
}
我想要得到的是每个用户的日志数量以及每个用户的不同“nums”列表。所以结果是这样的:
[
{
"user": A,
"total": 1,
"nums" : [1,2,3,4]
},
{
"user": B,
"total": 2,
"nums" : [1,2,4,5,7]
}
]
这可以在一个聚合查询中实现吗?我现在正在使用两个。
db.test.aggregate([{ $group: { _id:"$user", total:{$sum:1}}}])
db.test.aggregate([{$unwind:"$nums"}, { $group: { _id:"$user", nums:{$addToSet:"$nums"}}}])
另外,如果一个查询比大数据集上的两个单独查询要快,或者我应该只使用两个查询?
答案 0 :(得分:2)
您可以通过在_id
之后的$group
中的文档中汇总原始$unwind
值列表来实现此目的,从而提供获取最终总数的方法{ {1}}:
$project
结果:
db.test.aggregate([
{$unwind: '$nums'},
{$group: {
_id: '$user',
ids: {$addToSet: '$_id'},
nums: {$addToSet: '$nums'}
}},
{$project: {
_id: 0,
user: '$_id',
total: {$size: '$ids'},
nums: 1
}}
])
我希望在一个[
{
"nums": [
7,
5,
4,
2,
1
],
"user": "B",
"total": 2
},
{
"nums": [
4,
3,
2,
1
],
"user": "A",
"total": 1
}
]
管道而不是两个管道中完成所有操作会更快,但最好在您自己的环境中测试它以确保。