具有聚合的MongoDB文档数组计数字段

时间:2015-12-31 06:04:12

标签: mongodb aggregation-framework

您好我想计算一个文档的字段,'sendTime'字段在文档数组中,条件是

$and:[sendTime:{$gte:startTime},sendTime:{$lte:endTime}]

我的文件看起来像这样

{
    _id:ObjectId("5663c7d23d2a580bac21091b"),
    message:[
        {   
            msg:"1",
            sendTime:ISODate("2015-12-08T09:34:53.128Z")
        },
        {
            msg:"2",
            sendTime:ISODate("2015-12-09T09:34:53.128Z")
        }
        ....
    ]   
},
{
    _id:ObjectId("5663c7d23d2a580bac210912"),
    message:[
        {
            msg:"aaa",
            sendTime:ISODate("2015-12-06T09:34:53.128Z")
        },
        {
            msg:"bbb",
            sendTime:ISODate("2015-12-08T09:34:53.128Z")
        }
        ....
    ]   
}

我从其他问题中学习一种计算字段的方法。

db.chat.find().map(function(room){
    room.message.map(function(msg){
        if(msg.sendTime >= startTime&&msg.sendTime<=endTime)
            queryTotalMsg++;
    });
});

我尝试使用聚合来做同样的事情

db.chat.aggregate([
                    $project:{
                        message:"$message.sendTime"                 
                    }
                ]);

但我不知道如何计算带条件的sendTime

我不知道聚合可以用于这个问题。

感谢您的回答。

1 个答案:

答案 0 :(得分:0)

将您的条件设置为$ match并依赖于您是否要将所有数组文档统计为一个整体,也可以尝试$ unwind,例如..

db.chat.aggregate({$unwind: "$message" }, {$match: {condition}}, {$group: {_id: 1, count: { $sum: 1}}});

匹配参考:https://docs.mongodb.org/v3.0/reference/operator/aggregation/match/