我在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查询。
答案 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 } } }
])