我有这种类型的集合
{
"_id" : <id>,
"USER" : <user1>,
"LIST" : <array>,
"TIME" : 1234
},
{
"_id" : <user1>,
"USER" : <id>,
"LIST" : <array>,
"TIME" : 1233
},
{
"_id" : <user3>,
"USER" : <id>,
"LIST" : <array>,
"TIME" : 1230
},
{
"_id" : <id>,
"USER" : <user4>,
"LIST" : <array>,
"TIME" : 1234
},
{
"_id" : <user5>,
"USER" : <id>,
"LIST" : <array>,
"TIME" : 1233
},
最后,我想要一组这些文档,但是按TIME
字段分组,即,如果两个TIME
字段相同,则它们应该在同一个对象中。我还希望它由USER
字段过滤。我应该能够传递一个数组,只传递那些在数组中有值的文件。例如,如果我传递一个数组[user1, user2]
,它应该只返回按时间分组的结果,这些结果的用户值为user1
或user2
。如果计算组中的文档数量也会很好。
例如
传递的数组:[user1,user4]
[
{
"TIME": 1234,
"COUNT" : 2
},
{
"TIME": 1233,
"COUNT" : 1
}
]
我如何做到这一点? $in
是查询运算符,$group
是聚合运算符。我正在寻找一种将这两者结合起来的方法。
答案 0 :(得分:0)
就像Neil在评论中所说,你可以像这样使用聚合管道:
db.YourCollection.aggregate([
{$match: {_id: {$in: arrayOfIds}}},
{$project: {
TIME: "$TIME"
}},
{$group: {
_id: null,
TIME: "$TIME",
COUNT: {$sum: 1}
}}
]);
答案 1 :(得分:0)
db.collection.aggregate(
// Pipeline
[
// Stage 1
{
$match: {
USER: {
$in: ['user1', 'user4']
}
}
},
// Stage 2
{
$group: {
_id: {
TIME: '$TIME'
},
COUNT: {
$sum: 1
}
}
},
// Stage 3
{
$project: {
TIME: '$_id.TIME',
COUNT: 1,
_id: 0
}
},
]
);