为了账号安全,请及时绑定邮箱和手机立即绑定

MongoDB 查找和迭代 vs 计数

MongoDB 查找和迭代 vs 计数

Go
桃花长相依 2023-05-15 10:13:37
我对 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我们通常会在其上进行查询。我们尝试了两种类型的查询。db.Collection.find({"iden": "343754856", "name": "alan", "created":{"$gt": ....}).count()其中“created”是一个未索引的字段。db.Collection.find({"iden": "343754856", "name": "alan"})并遍历所有记录以根据created.然而,MongoDB 似乎在执行第二个查询时花费了大量时间,而它应该是对 1 的优化。关于这里出了什么问题的任何线索?我们正在使用 Go 库。
查看完整描述

1 回答

?
慕雪6442864

TA贡献1812条经验 获得超5个赞

第二个版本怎么可能是第一个版本的优化?

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

相信我,MongoDB 可以像在 Go 客户端中一样快地在内部计算结果文档。让 MongoDB 服务器发送结果、获取结果并在客户端解组它们需要更多的时间(取决于很多因素)。

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

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


查看完整回答
反对 回复 2023-05-15
  • 1 回答
  • 0 关注
  • 62 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信