MongoDB:使用来自多个集合的数据进行筛选
我有一个应用程序,它以事件的形式存储用户及其行为。有两个集合,一个用于用户,一个用于事件。文档如下所示: 用户MongoDB:使用来自多个集合的数据进行筛选,mongodb,schema,aggregation-framework,Mongodb,Schema,Aggregation Framework,我有一个应用程序,它以事件的形式存储用户及其行为。有两个集合,一个用于用户,一个用于事件。文档如下所示: 用户 { "_id" : ObjectId("593aa71e2f9d5140000bb44e"), "name" : "Antonette Ortiz", "country" : "France" } 事件 { "_id" : ObjectId("593aaa84c685604066a6a0cf"), "name" : "message_sent"
{
"_id" : ObjectId("593aa71e2f9d5140000bb44e"),
"name" : "Antonette Ortiz",
"country" : "France"
}
事件
{
"_id" : ObjectId("593aaa84c685604066a6a0cf"),
"name" : "message_sent",
"timestamp" : ISODate("2016-11-01T04:39:52.667Z"),
"user" : ObjectId("593aa728d135484002399bac"),
"attributes" : {
"str" : "plum",
"int" : 82
}
}
现在,我希望能够获取一个用户列表,不仅根据他们的属性,而且还根据他们触发的事件以及特定的时间范围
例如,查询如下:“过去7天内至少发送了3条消息的所有法国用户”。
如何使用MongoDB实现这一点,以及性能方面(例如,如果我有数百万个事件)?仅使用这两个集合就可以做到这一点,还是必须使用聚合/映射减少?如果是这样,您会建议如何更改模式?根据MongoDB文档 $lookup阶段在来自 使用“已加入”文档中的字段输入文档 收藏 例如 “过去7天内至少发送了3封邮件的所有法国用户”。 要检索上述条件的数据,其聚合查询如下
db.Event.aggregate(
// Pipeline
[
// Stage 1
{
$match: {
name:'message_sent',
timestamp:{$gte:ISODate("2016-10-25T04:39:52.667+0000"),$lte:ISODate("2016-11-01T04:39:52.667+0000")}
}
},
// Stage 2
{
$group: {
_id:{user:'$user'},
counter:{$sum:1}
}
},
// Stage 3
{
$lookup: {
"from" : "User",
"localField" : "_id.user",
"foreignField" : "_id",
"as" : "user"
}
},
// Stage 4
{
$match: {
'user.country':'France' ,
counter:{$gte:3}
}
},
]
);
通过查找进行聚合,或在应用程序级别进行聚合。mapreduce仅适用于单个集合,因此它需要一个临时集合来执行查找,这很难适用于操作查询。您能否提供一个使用查找进行聚合的示例?您将如何在应用程序级别实现这一点?您的意思是请求数据然后手动合并吗?如果您遇到任何特殊问题,请随时询问。使用应用层-是。从事件中获取所有匹配的用户ID(同样使用聚合,但不使用查找),然后按ID获取用户。