MongoDB查找并迭代与计数

时间:2018-11-29 11:56:48

标签: mongodb performance go

我对Mongo有一个特殊的问题。

我们具有以下结构的80万份文档。

{
"_id" : ObjectId("5bd844199114bab3b2c19fab"),
"u" : 0,
"c" : 0,
"iden" : "343754856",
"name" : "alan",
"email" : "mkasd@abc.com",
"mobile" : "987654321093456",
"expires" : ISODate("2018-11-29T11:44:25.453Z"),
"created" : ISODate("2018-10-30T11:44:25.453Z")
}

我们已经索引了idenname,我们通常在这些索引上查询。 我们尝试了两种查询。

  1.   

    db.Collection.find({“ iden”:“ 343754856”,“ name”:“ alan”,“ created”:
      {“ $ gt”:....})。count()

    其中“创建的”是未索引字段。

  2.   

    db.Collection.find({“ iden”:“ 343754856”,“ name”:“ alan”})

    并遍历所有记录以基于created进行过滤。

但是,MongoDB在执行第二个查询时似乎要花费大量时间,而这本来应该是对1的优化。

任何人都在想这里出什么问题了吗? 我们正在使用Go库。

1 个答案:

答案 0 :(得分:1)

第二个版本如何对第一个版本进行优化?

您的第一个查询从MongoDB服务器检索一个数字:查询结果的总数。当第二个版本获取所有匹配的文档时,则在“客户端”端进行计数。

相信我,MongoDB可以像在Go客户端中一样快地在内部对结果文档进行计数。使MongoDB服务器发送结果,获取结果并在客户端解组它们会花费更多的时间(取决于许多因素)。

请注意,如果您有一个包含"iden""name"的复合索引,即使您添加了更多过滤器(例如您的示例中的"created"),该索引仍然可以使用,但是MongoDB必须遍历部分结果才能应用其余查询。要了解是否使用了索引,请执行以下命令:

db.Collection.find(
    {"iden": "343754856", "name": "alan", "created": {"$gt": ....}
).explain()