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查询速度变慢_Mongodb_Aggregation Framework - Fatal编程技术网

索引后Mongodb查询速度变慢

索引后Mongodb查询速度变慢,mongodb,aggregation-framework,Mongodb,Aggregation Framework,我有一个收藏,比如说db中的水果。其中有以下字段 { "_id": ObjectId(...), "item": "Banana", "category": ["food", "produce", "grocery"], "location": "4th Street Store", "stock&

我有一个收藏,比如说db中的水果。其中有以下字段

{
 "_id": ObjectId(...),
 "item": "Banana",
 "category": ["food", "produce", "grocery"],
 "location": "4th Street Store",
 "stock": 4,
 "type": "cases"
}
默认情况下_id上有一个索引,我添加了另一个索引

{
 "item": "1",
 "category": "1",
 "stock": "1",
 "type": "1"
}
这个集合有数千个数据,我的查询响应很慢。我的问题是

在我上面提到的索引之后,我需要添加所有这些吗 检查我的查询,或者我可以对添加到索引中的键使用任何键

比如,目前我的查询是

fruits.find({item: 'new'});
fruits.find({item: 'new', category: 'history'});
fruits.find({stock: '5', category: 'drama'});
fruits.find({type: 'new'});
我的索引包含所有这些键,是否足以满足此要求 为所有这些组合键创建了不同的索引 上面提到过吗

有时我在使用查询,有时我在其他一些集合上使用聚合,查找这些集合,然后执行搜索等

{
 "item": "1",
 "category": "1",
 "stock": "1",
 "type": "1"
}
该索引将部分用于以下方面

fruits.find({item: 'new'}); **Will work (Partially)**
fruits.find({item: 'new', category: 'history'}); **Will work (Partially)**
fruits.find({stock: '5', category: 'drama'}); **Won't work**
fruits.find({type: 'new'}); **Won't work**
Partially=>索引基本上是MongoDB中B树数据结构的一个添加项,它映射系统中的文档。项上的索引前缀允许索引用于您提到的第一个和第二个查询,但它将是第三个和最后一个查询的集合扫描

在这里阅读

从长远来看,您需要正确理解索引,特别是对于查询,您可以寻求帮助,但知识差距将成为一个问题。简短的阅读会非常有用

编辑


Aggregation=>取决于查询的一部分,大多数情况下仅针对匹配项,此后可以在内存中使用索引(查看更多详细信息)。对于查找,如果在另一个集合上有索引(同样是匹配部分),则可以使用该集合上的索引来获取数据,但在获取该数据之后,对其执行的任何额外操作都将在内存中完成。从逻辑上讲,大部分数据的获取都是在索引将被使用的地方,用于对上面链接的文档进行排序

该索引将部分用于以下方面

fruits.find({item: 'new'}); **Will work (Partially)**
fruits.find({item: 'new', category: 'history'}); **Will work (Partially)**
fruits.find({stock: '5', category: 'drama'}); **Won't work**
fruits.find({type: 'new'}); **Won't work**
Partially=>索引基本上是MongoDB中B树数据结构的一个添加项,它映射系统中的文档。项上的索引前缀允许索引用于您提到的第一个和第二个查询,但它将是第三个和最后一个查询的集合扫描

在这里阅读

从长远来看,您需要正确理解索引,特别是对于查询,您可以寻求帮助,但知识差距将成为一个问题。简短的阅读会非常有用

编辑


Aggregation=>取决于查询的一部分,大多数情况下仅针对匹配项,此后可以在内存中使用索引(查看更多详细信息)。对于查找,如果在另一个集合上有索引(同样是匹配部分),则可以使用该集合上的索引来获取数据,但在获取该数据之后,对其执行的任何额外操作都将在内存中完成。从逻辑上讲,大部分数据的提取都是在索引将被使用的地方,用于排序部分。请阅读上面链接的文档。

您能显示解释查询的结果吗?中的解释很好,只需按照文档的说明操作即可。您能显示解释查询的结果吗?中的解释很好,只需按照文档中的说明进行操作。好的,我明白了,如果我们在集合上使用lookup等来运行聚合,那么这个逻辑将是相同的?聚合=>取决于查询的一部分,主要是为了匹配,在内存中发生其他所有事情之后,您可以使用索引。对于查找,如果在索引上有索引,则使用其他集合上的索引获取数据。(MuHADADAADILBANARAS更新了答案,考虑接受这个答案。好,我明白了,如果我们在查找集合上运行聚合,那么这个逻辑是相同的?聚合= =取决于查询的一部分,大多数情况下,只有在匹配时,您才可以使用索引,此后所有其他内容都会发生在内存中。对于查找,如果在索引上有索引,则使用其他集合上的索引获取数据(再次匹配部分)。MuHuMADAADILBANARAS更新了答案,考虑接受这个作为答案。