Mongo查询计数n + 1场景

时间:2015-05-26 16:10:46

标签: mongodb mongodb-query

给定具有属性的mongo集合" createdDate"," eventType"还有其他几个,我想查询给定日期范围之间的文档,并按eventType列出计数。 截至目前,我有一个冗长的方法:

  • 在给定日期范围
  • 之间查询不同的eventType
db.EventMessage.distinct( "eventType" , { "env" : "prod" });

让我们说这个查询yeilds,Foo1EventType,Foo2EventType,Foo3EventType等。

  • 对于上面的每个eventType,查询给定日期范围的文档计数
db.EventMessage.count ( { "eventType" : "Foo1EventType" ,  "createdDate" :  {"$gte": new Date("2015-05-22") , "$lt" : new Date("2015-05-23") }  });

上面的查询给出了指定日期范围之间Foo1EventType的事件计数。但是,我需要分别为每个eventType运行此查询。我想检查更好的执行查询,该查询迭代所有不同的eventTypes并根据eventType列出计数 MongoDB每天包含超过50K的文档,并且在任何时间点都可以保存6个月的数据。

对于给定的日期范围,是否有更好的执行查询来按每个eventType产生计数?

1 个答案:

答案 0 :(得分:0)

根据您对大型数据集的要求,您应首先index您的文档或使用shard index

要查找所有不同的eventType,然后将forEach用于所有不同的数据,如下所示:

db.EventMessage.distinct("eventType", {
  "env": "prod"
}).forEach(function(data) {
  var doc = db.EventMessage.find({
    "eventType": data,
    "createdDate": {
      "$gte": new Date("2015-05-22"),
      "$lt": new Date("2015-05-23")
    }
  }).count();
  print(doc);
})