Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/12.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中使用$sort或阻止使用索引吗?_Mongodb - Fatal编程技术网

在mongodb中使用$sort或阻止使用索引吗?

在mongodb中使用$sort或阻止使用索引吗?,mongodb,Mongodb,似乎使用$或进行排序可以进行完整的表扫描,避免使用标题和关键字的索引。在使用$或查询时,如何让它使用我的两个索引 此查询同时使用标题和关键字索引 db.tasks.find({$or: [{keywords: /^japan/}, {title:/^japan/}]}) 这将执行完整的表扫描,并使用我的索引总计\u1 db.tasks.find({$or: [{keywords: /^japan/}, {title:/^japan/}]}).sort({total:-1}) 而对关键字或标题

似乎使用$或进行排序可以进行完整的表扫描,避免使用标题和关键字的索引。在使用$或查询时,如何让它使用我的两个索引

此查询同时使用标题和关键字索引

db.tasks.find({$or: [{keywords: /^japan/}, {title:/^japan/}]})
这将执行完整的表扫描,并使用我的索引总计\u1

db.tasks.find({$or: [{keywords: /^japan/}, {title:/^japan/}]}).sort({total:-1})
而对关键字或标题进行排序的查询则分别使用关键字或标题的索引

db.tasks.find({title:/^japan/}).sort({total:-1})
db.tasks.find({keywords:/^japan/}).sort({total:-1})

Mongo中的排序和索引是一个复杂的主题。Mongo还有一个特殊错误,如果项目太多,它会阻止您在没有索引的情况下进行排序。因此,您询问索引是件好事,因为未索引的排序最终将开始失败

有一个似乎覆盖了你的问题,但是还有一些额外的细节要考虑。< /P> 首先要注意的是您最后的查询:

db.tasks.find({title:/^japan/}).sort({total:-1})
db.tasks.find({keywords:/^japan/}).sort({total:-1})
这些查询最终将失败,因为您只在
title
上编制索引,而不是在
title/total
上编制索引。这里有一个脚本可以演示这个问题

> db.foo.ensureIndex({title:1})
> for(var i = 0; i < 100; i++) { db.foo.insert({title: 'japan', total: i}); }
> db.foo.count()
100
> db.foo.find({title: 'japan'}).sort({total:-1}).explain()
... uses BTreeCursor title_1
> // Now try with one million items
> for(var i = 0; i < 1000000; i++) { db.foo.insert({title: 'japan', total: i}); }
> db.foo.find({title: 'japan'}).sort({total:-1}).explain()
Sat Mar 31 05:57:41 uncaught exception: error: {
        "$err" : "too much data for sort() with no index.  add an index or specify a smaller limit",
        "code" : 10128
}
我上面列出的JIRA bug是针对以下内容的:

> db.foo.find({$or: [title:/^japan/, title:/^korea/]}).sort({total:-1})

你的稍有不同,但会遇到同样的问题。即使您在
title/total
keyword/total
上都有索引,MongoDB也无法最佳地使用索引。

如果您有{total:-1,title:1}的索引和{total:-1,title:1}排序,这至少能提高索引扫描的效率吗?@drogon您在筛选什么?里面有
find()
子句吗?JIRA错误非常特定于使用带有排序的
$或
子句。
> db.foo.find({$or: [title:/^japan/, title:/^korea/]}).sort({total:-1})