Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.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_Sorting - Fatal编程技术网

MongoDB排序检查索引列上的记录过多

MongoDB排序检查索引列上的记录过多,mongodb,sorting,Mongodb,Sorting,在使用mongodb排序函数时,我注意到它检查了太多的记录,但如果我不使用排序,它只检查22个文档并返回它们 我正在尝试让那些购买了DESC订单中的一些产品的用户 products.userid和orderTime都被索引 db.collection.find({$or:[{'products.userIDs':{$in:usersArray}} , {'item.userIDs':{$in:usersArray}}]}) .sort({orderTime:-1}) .explain(); 未

在使用mongodb排序函数时,我注意到它检查了太多的记录,但如果我不使用排序,它只检查22个文档并返回它们

我正在尝试让那些购买了DESC订单中的一些产品的用户

products.userid
orderTime
都被索引

db.collection.find({$or:[{'products.userIDs':{$in:usersArray}} , {'item.userIDs':{$in:usersArray}}]})
.sort({orderTime:-1})
.explain();
未经排序,检查的文档为22个 检查的排序文件为1602


如何在不检查过多文档的情况下对文档进行排序。

Mongo在每个查询中只使用一个索引(除非有
$或
)。如果您希望对该特定查询建立良好的索引,那么您需要在
{“products.userIDS”:1,“orderTime”:1}
上建立索引。这样,当它找到文档时,它们就已经被排序了&不需要在内存中进行排序。报告中有更多细节

如果我的查询中有
,我需要用你提到的字段索引吗?$或查询可以对每个$OR中的不同查询使用不同的索引,因此如果您有类似
{$或:[{a:“foo”},{b:“bar”]}
,mongo可以使用类似
{a:1}
的索引来获取匹配
{a:“foo”}
和一个类似
{b:1}
的索引来查找
{b:“bar”}
s。我不认为这与您所问的相关——我只是想澄清一下,mongo通常每个查询使用一个索引(并且不能利用多个索引)除非有类似$or的东西。事实上,我在查询中有$or,我尝试了使用和不使用它,结果都是一样的,这就是为什么我设置查询时没有$or,因为我没有看到任何不同,但是因为我有$or,或者我能做什么?如果每个$or中的字段都相同,那就不重要了。如果你在添加排序,你会想添加字段您正在对复合索引进行排序。值得仔细阅读复合索引的文档我已经阅读了很多次,我确实在多个字段上创建了一个复合索引,但仍然存在同样的问题。我编辑了我的查询,所以您可以看一看。您的回答是,您认为我需要为
orderDate
item.userid
products.userid