【发布时间】:2019-03-22 06:57:32
【问题描述】:
如何通过一个字符串数组进行排序来进行查询,该字符串数组将在其计划中没有"stage" : "SORT" 的情况下执行?
我正在使用 mongo 3.6
“mycoll”集合包含大约 500.000 个文档,如下所示:
{
someobject:{
arrayfield:["asd","qwe"]
}
}
{
someobject:{
arrayfield:["zxc"]
}
}
这个查询
db.mycoll.find().sort({ "someobject.arrayfield": 1 }).skip(125340).limit(20)
产生错误
排序操作使用的 RAM 超过了最大 33554432 字节
我在“someobject.arrayfield”上有索引,但是 explain() 给了我:
"winningPlan" : {
"stage" : "SKIP",
"skipAmount" : 125340,
"inputStage" : {
"stage" : "SORT",
"sortPattern" : {
"someobject.arrayfield" : 1
},
"limitAmount" : 125360,
"inputStage" : {
"stage" : "SORT_KEY_GENERATOR",
"inputStage" : {
"stage" : "FETCH",
"inputStage" : {
"stage" : "IXSCAN",
"keyPattern" : {
"someobject.arrayfield" : 1
},
"indexName" : "arrayfield_indexname",
"isMultiKey" : true,
"multiKeyPaths" : {
"someobject.arrayfield" : [
"someobject.arrayfield"
]
},
"isUnique" : false,
"isSparse" : false,
"isPartial" : false,
"indexVersion" : 2,
"direction" : "forward",
"indexBounds" : {
"someobject.arrayfield" : [
"[MinKey, MaxKey]"
]
}
}
}
}
}
}
我知道,我可以增加限制,将聚合与 'allowdiskusage' 或查询一起使用
db.mycoll.find().sort({ "someobject.arrayfield.1": 1 }).skip(125340).limit(20)
在“someobject.arrayfield.1”上有索引
【问题讨论】:
-
为什么要跳过
125340文档? -
@styvane 获得第 6267 页,大小为 20
-
不能对文档应用过滤器而不是跳过它们吗?
-
@styvane 让我们说“不”。我的目标是通过排序结果的大小和数量来获取页面。我在问题中省略了过滤子句,因为我认为如果可以使用空 find() 执行此操作,那么也可以使用复合索引过滤查询。
-
@VladMamaev,你是对的。这在 3.4 中没问题,但在 3.6 和 4.0 中会产生 SORT。不幸的是,根据这个 mongo jira 问题jira.mongodb.org/browse/SERVER-33387,这被认为是“按设计工作”。他们甚至在文档中添加了此限制,请参阅 docs.mongodb.com/manual/tutorial/sort-results-with-indexes 和 docs.mongodb.com/manual/core/index-multikey/#limitations 中的注释。提交改进请求:jira.mongodb.org/browse/SERVER-31898
标签: mongodb