所以,我需要的不是完全一个连接,而是非常相似的东西。主要区别在于我需要的所有数据都在同一个集合中。我见过的其他答案,与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
答案 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"}}
)