猿问

MongoDB 查找和迭代 vs 计数

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


我们有一个具有以下结构的 800k 文档集合。


{

"_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")

}

我们已经建立了索引iden,并且name我们通常会在其上进行查询。我们尝试了两种类型的查询。

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

    其中“created”是一个未索引的字段。

  2. db.Collection.find({"iden": "343754856", "name": "alan"})

    并遍历所有记录以根据created.

然而,MongoDB 似乎在执行第二个查询时花费了大量时间,而它应该是对 1 的优化。

关于这里出了什么问题的任何线索?我们正在使用 Go 库。


桃花长相依
浏览 78回答 1
1回答

慕雪6442864

第二个版本怎么可能是第一个版本的优化?您的第一个查询从 MongoDB 服务器检索一个数字:查询结果的总数。当您的第二个版本获取所有匹配的文档时,您在“客户端”端进行计数。相信我,MongoDB 可以像在 Go 客户端中一样快地在内部计算结果文档。让 MongoDB 服务器发送结果、获取结果并在客户端解组它们需要更多的时间(取决于很多因素)。请注意,如果您有一个包含"iden"and的复合索引"name",即使您添加了更多过滤器(如"created"您的示例),该索引仍可能被使用,但 MongoDB 必须迭代部分结果以应用查询的其余部分。要查看索引是否被使用,请执行以下命令:db.Collection.find(     {"iden": "343754856", "name": "alan", "created": {"$gt": ....} ).explain()
随时随地看视频慕课网APP

相关分类

Go
我要回答