MongoDB:数组的不同元素的计数

时间:2015-12-04 11:29:16

标签: mongodb select mongodb-query distinct

我在MongoDB的集合中有以下文档:

{
    "userid" : 1,
    "open" : [
        {
            "messageid" : 1441,
            "viewed" : ISODate("2015-03-24T00:50:00Z"),
        },
        {
            "messageid" : 1441,
            "viewed" : ISODate("2015-06-21T00:10:00Z"),
        },
        {
            "messageid" : 1527,
            "viewed" : ISODate("2015-06-21T07:52:00Z"),
        }
    ]
}
{
    "userid" : 2,
    "open" : [
        {
            "messageid" : 2155,
            "viewed" : ISODate("2015-09-15T15:32:00Z"),
        },
        {
            "messageid" : 2208,
            "viewed" : ISODate("2015-10-02T12:20:00Z"),
        },
        {
            "messageid" : 2263,
            "viewed" : ISODate("2015-01-15T07:50:00Z"),
        }
    ]
}

我希望用户在指定的时间段内查看过3条或更多条不同的消息。

示例查询:

  

向我提供在2015-01-01至2015-11-30之间查看了3条或更多不同邮件的用户

预期结果:{userid: 2}

注意:(userid: 1)还在指定的日期范围内查看了3条消息,但它们并非不同的消息。

请帮我构建MongoDB select查询。

1 个答案:

答案 0 :(得分:3)

您可以使用聚合,例如

db.userDetails.aggregate( [
    { $unwind: "$open" }, 
    { $match: { 
        "open.viewed": { $gte: ISODate( new Date("2015-01-01").toISOString()), $lte: ISODate( new Date("2015-11-30").toISOString()) 
        } 
    }}, 
    { $group: {
        _id: "$userid", 
        open_messageids: { $addToSet: "$open.messageid" }
    }}, 
    { $unwind: "$open_messageids" }, 
    { $group: { 
        _id: null, 
        count: { $sum: 1 } 
    }},
    { $match: { count : { $gte : 3 } } }
])