我的收藏中有6个索引字段。我的应用程序使用具有不同组合的聚合查询。以下是一些可能的例子:
1. {$match: {$and: [{field1: {$in: [1,2,3]}}, {$field5: {$gt: 8}}]}}
2. {$match: {$and: [{field2: {$nin: [4,5,6]}}, {$field5: {$lte: 8}}, {$field6: 5}]}}
3. {$match: {field1: {$in: [7,8,9]}}}
正如我之前所说,所有字段都已编入索引。在cource中,当我执行第一个查询时, explain()函数告诉我,只使用了一个索引。查询中的字段数取决于用户的选择。
我应该为每个字段组合创建索引(我的意思是 {field1:1,field2:1},{field1:1,field2:1,field3:1} 等)或者我可以为所有字段创建一个复合索引,如 {field1:1,field2:1,field3:1,field4:1,field5:1,field6:1} ?
我认为第一个决定可能有点奇怪,因为6个领域有很多组合。
答案 0 :(得分:0)
如果查询中有6个字段中的任何一个,您可以更改单词,而不是让单个字段创建键/值对数组。
{values: [n:"field1", v: "meerkat", n:"field2", value:"mongoose"] }
现在,您可以定义涵盖所有字段的单个复合索引。
{"values.n": 1, "values.v": 1}
您的查询将如下所示:
{ "values": { "$elemMatch" : { v:"field1", v:"meerkat" } }
答案 1 :(得分:0)
您的第二种方式可行,但更改排序顺序。
有两点需要注意:
当索引包含查询扫描的所有字段时,索引支持查询。查询扫描索引而不是集合。创建支持查询的索引可以大大提高查询性能。
- 醇>
如果您有时仅查询一个密钥,并且在其他时间查询该密钥并结合第二个密钥,则创建复合索引比创建单个密钥索引更有效。 MongoDB将对两个查询使用复合索引。多个字段上的单个复合索引可以支持搜索这些字段的“前缀”子集的所有查询。
示例:
集合上的以下索引:
{x:1,y:1,z:1} 可以支持以下索引支持的查询:
{x:1} {x:1,y:1} 在某些情况下,前缀索引可能提供更好的查询性能:例如,如果z是一个大型数组。
{x:1,y:1,z:1}索引也可以支持许多与以下索引相同的查询:
{x:1,z:1} 此外,{x:1,z:1}还有一个用途。鉴于以下查询:
db.collection.find({x:5})。sort({z:1}) {x:1,z:1}索引支持查询和排序操作,而{x:1,y:1,z:1}索引仅支持查询。有关排序的更多信息,请参阅Use Indexes to Sort Query Results。
对多个字段进行排序的基本示例:
您可以对索引的所有键或子集指定排序;但是,排序键必须按它们在索引中显示的顺序列出。例如,索引键模式{a:1,b:1}可以支持{a:1,b:1}上的排序,但不能支持{b:1,a:1}上的排序。
对于使用复合索引进行排序的查询,cursor.sort()文档中所有键的指定排序方向必须与索引键模式匹配,或者与索引键模式的反转匹配。例如,索引键模式{a:1,b:-1}可以支持对{a:1,b:-1}和{a:-1,b:1}的排序,但不支持{a: - 的排序1,b:-1}或{a:1,b:1} Read this。