gpt4 book ai didi

mongodb - 为什么 MongoDB 在这里使用 scanAndOrder?

转载 作者:可可西里 更新时间:2023-11-01 09:52:19 41 4
gpt4 key购买 nike

我在 MongoDB 中保存游戏文档。除其他外,文件还包含玩家姓名 (name)、游戏结束时间 (endMS) 和游戏类型 (type)。类型可以有五分之一的不同值。

我需要搜索按游戏结束时间排序的玩家完成的所有游戏,以及按游戏结束时间排序的特定游戏类型的玩家完成的所有游戏。

两个查询的例子是

db.games.find({name:"Stefan",endMS:{$gt:0}}).sort({endMS:-1})

db.games.find({name:"Stefan",type:"bli",endMS:{$gt:0}}).sort({endMS:-1})

你可以使用索引

db.games.ensureIndex({name:1,endMS:-1})

db.games.ensureIndex({name:1,type:1,endMS:-1})

快速访问。

现在我尝试只使用一个索引:

db.games.ensureIndex({name:1,endMS:-1,type:1})

第一个查询或类(class)仍然运行良好。第二个查询的想法是,Mongo 在扫描索引时可能需要跳过一些条目,而只需要访问查询最终返回的文档,因为索引中已经可以检查“类型”。这应该足以满足我的需求。

但是使用 explain() MongoDB 告诉我在这样查询数据库时需要“scanAndOrder”。

db.games.find({name:"Stefan",type:"bli",endMS:{$gt:0}}).sort({endMS:-1}).explain()

{
"cursor" : "BtreeCursor name_1_endMS_-1_type_1",
"isMultiKey" : false,
"n" : 1,
"nscannedObjects" : 1,
"nscanned" : 22,
"nscannedObjectsAllPlans" : 4,
"nscannedAllPlans" : 25,
"scanAndOrder" : true,
"indexOnly" : false,
"nYields" : 0,
"nChunkSkips" : 0,
"millis" : 0,
"indexBounds" : {
"name" : [
[
"Stefan",
"Stefan"
]
],
"endMS" : [
[
Infinity,
0
]
],
"type" : [
[
"bli",
"bli"
]
]
},
"server" : "localhost:27017",
"filterSet" : false
}

nscannedObjects 和 nscanned 与上面描述的一样,但我想知道为什么 Mongo 说 scanAndOrder:true。

根据文档:“scanAndOrder 是一个 bool 值,当查询不能使用索引中文档的顺序返回排序结果时为真:MongoDB 必须在从游标接收文档后对文档进行排序。”

据我所知,文档应该在索引中排序,只需要跳过一些不影响顺序的文件。

那么为什么 MongoDB 在这里使用 scanAndOrder?

最佳答案

这似乎是 MongoDB 2.6.0-rc0 中的一个错误。在 MongoDB 2.4.9 中,一切都按预期工作。

关于mongodb - 为什么 MongoDB 在这里使用 scanAndOrder?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22051516/

41 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com