同时使用$ group和过滤查询

时间:2018-04-19 08:48:48

标签: arrays mongodb mongoose mongodb-query aggregation-framework

我有这种类型的集合

{
    "_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],它应该只返回按时间分组的结果,这些结果的用户值为user1user2。如果计算组中的文档数量也会很好。

例如

传递的数组:[user1,user4]

[
    {
        "TIME": 1234,
        "COUNT" : 2            
    },
    {
        "TIME": 1233,
        "COUNT" : 1            
    }

]

我如何做到这一点? $in是查询运算符,$group是聚合运算符。我正在寻找一种将这两者结合起来的方法。

2 个答案:

答案 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
            }
        },

    ]



);