我有大约100个看起来像这样的文件:
{
"_id": "p1",
"when": "2016-06-01T00:00:00.000Z",
"users": [
"u1",
"u2"
]
},
{
"_id": "p2",
"when": "2016-06-01T00:00:00.000Z",
"users": [
"u1",
"u3"
]
},
{
"_id": "p3",
"when": "2016-06-01T00:00:00.000Z",
"users": [
"u1",
"u2",
"u3"
]
}
我想运行一个查询,它将返回两个日期之间正好存在于3个文档中的所有用户ID。
例如,使用上述数据,对于2016-04-01至2016-07-01的日期,它将返回u1(u1存在于这些日期之间的3条记录中)。
我认为它会使用某种group by或count和聚合框架,但我正在寻找最有效/最有效的方法,所以我愿意接受建议。请记住,虽然可能只有100个文档,但可能有100万个用户(因此每个文档中的用户数组可能很大)。
有什么想法吗?
答案 0 :(得分:1)
您可以尝试此查询
db.getCollection('collectionName').aggregate([
{$match:{$and:[{"when": { "$gte": '2016-06-01T00:00:00.000Z' }},{"when": { "$lte": '2016-06-01T00:00:00.000Z' }}]}},
{$unwind: "$users"},
{$group:{_id:"$users", count:{$sum:1}}},
{$match:{"count":{"$eq":3}}}
])
在这个查询中我遵循了一些步骤
- 过滤日期之间的记录
- 计算每个用户存在的次数
- 过滤以准确获得3次用户
醇>