Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
关于mongodb中子集排序的澄清_Mongodb_Indexing - Fatal编程技术网

关于mongodb中子集排序的澄清

关于mongodb中子集排序的澄清,mongodb,indexing,Mongodb,Indexing,我在mongodb中有字段a、b、c、d、e、p的文档。 我有{a:1},{b:1},{c:1},{d:1},{e:1},{p:1},以及复合索引{a:1,b:1,c:1}。 字段p表示字段的位置 如果我有这样一个选择:{a:'something',b:'something',c:'and reach'},我知道它肯定会使用索引{a:1,b:1,c:1}来搜索(显然) 但是,如果我想按p({p:1})进行排序,那么实际会使用索引对数据进行排序吗?我很担心,因为我可能有一个很大的数据集 我读了很多

我在mongodb中有字段
a、b、c、d、e、p
的文档。 我有
{a:1}
{b:1},
{c:1},
{d:1},
{e:1},
{p:1}
,以及复合索引
{a:1,b:1,c:1}
。 字段
p
表示字段的位置

如果我有这样一个选择:
{a:'something',b:'something',c:'and reach'}
,我知道它肯定会使用索引
{a:1,b:1,c:1}
来搜索(显然)

但是,如果我想按
p
{p:1}
)进行排序,那么实际会使用索引对数据进行排序吗?我很担心,因为我可能有一个很大的数据集

我读了很多书,但不能完全理解我的用例(尽管它可能在那里)

最好说“MongoDB可以使用一个索引进行匹配,使用另一个索引进行排序吗?”答案是否定的

explain输出中要“查找”的内容是查看是否使用了索引进行排序,当索引无法使用时,该值将显示
true
,如果可以,该值将显示
false

考虑到您调整了示例,在“a”、“b”和“c”上有一个复合索引,在“p”上有一个单独的索引,然后是这样一个查询:

db.collection.find({a:a',b:b}).sort({p:1}).explain()
将显示复合索引用于查询,但未用于排序。但如果您创建了这样的索引:

ensureIndex({a:1,b:1,p:1})

然后将使用索引进行排序。以类似的方式,如果您创建了以下内容:

ensureIndex({p:1,a:1,b:1})

然后,也可以选择该索引,并通过sort操作进行选择,还可以将其用作排序。但效率不是很高,因为索引中将扫描
a
b
的所有值以确定结果


最后一个例子是非常少量的文档和您最初的复合选择,考虑到要扫描的文档数量很少,优化器可能只会选择“p”索引,而事实上,它可能只会使用该索引来影响排序操作。

我希望优化器使用该索引,但是您应该能够通过使用
explain()
来验证它:我想您对实际数据的了解非常笼统,但是既然您提到了“positions”,那么这是否相关:因此,最好的方法是实际执行
db.collection.ensureIndex({a:1,b:1,p:1})
,以确保m查询被索引。。。对吗?@Merc如果你的要求符合这样的要求,那么是的。尽量不要创建太多的索引或太多的复合字段,并限制您常用的字段。