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获取用户。