在一个查询中获取来自不同类型文档的数据

时间:2017-04-18 18:16:10

标签: mongodb mongodb-query

所以,我需要的不是完全一个连接,而是非常相似的东西。主要区别在于我需要的所有数据都在同一个集合中。我见过的其他答案,与MongoDB中的连接有关,都在集合之间。

在我的收藏中,我有不同类型的文件。

为了举例,请考虑以下两点:

{
    "success" : true,
    "action" : "logEventGA",
    "timestamp" : 1490795738759,
    "terminal" : "3533322585",
    "device" : {
        "cordova" : "4.3.0",
        "model" : "iPhone8,1",
        "platform" : "iOS",
        "uuid" : "785ED0AB-996D-4E54-8E0F-404FE076BE4F",
        "version" : "10.2.1",
        "manufacturer" : "Apple",
        "isVirtual" : false,
        "serial" : "unknown"
    },
    "action_GA" : "login"
}

{
    "success" : true,
    "action" : "loginAttempt",
    "timestamp" : 1483125811453,
    "terminal" : "3533322585",
    "id": {
        "doc": 23324355,
        "valid": true
    }   
    "httpCode" : NumberInt("200")
}

每个人的定义特征是他们的action。根据{{​​1}},对象将有不同的信息。

所以,我需要一个查询来从这两种文档中获取信息(操作“loginAttempt”和“logEventGA”),并匹配(join?)它们 - 在这种情况下,我们可以使用{{1属性。

我尝试在第一种类型的文档上运行查询,而不是action来获取其他类型文档的剩余数据(与顺序无关),但速度非常慢。此外,每个操作还有其他标准(例如,当action = loginAttempt时,httpCode必须为200)。有没有办法一次性做到这一点?

以下是我对“加入”的尝试,其表现迟缓。每行处理需要两秒钟,而且它似乎越来越慢。不能用这个。

terminal

预期结果将是这样的(或者在上面的代码中以CSV格式表示):

forEach

1 个答案:

答案 0 :(得分:1)

您可以尝试以下聚合查询。这只适用于两对。

以下查询对action上的数据进行排序,以便它可以使用排序来投影文档字段。

db.collection.aggregate(
{$match:{$or:[{ "timestamp": { $gte: new Date('2016-04-01').getTime() },
    "action":"loginAttempt", 
    "httpCode": 200},{"action":"logEventGA"}]}},
{$sort:{action:1}},
{$group:{"_id":"$terminal", "first":{"$first":"$$ROOT"}, "second":{"$last":"$$ROOT"}}},
{$project:{terminal:"$_id", device:"$first.device.uuid", doc:"$second.id.doc"}}
)