猫鼬文档中的索引

var*_*yar 0 mongoose mongodb node.js mongoose-schema

我正在开发一个搜索功能,其中我必须搜索文档中的多个字段。

我有以下案例:

1)获取field1,field2,field3,field4与字符串(nayyar)匹配的所有文档

2) 获取 field1、field2、field3、field4 与字符串 (nayyar) 匹配且性别应为(输入值)或“N/A”的所有文档。

3) 获取 field1、field2、field3、field4 与字符串 (nayyar) 匹配的所有文档,并且年龄应在ageHigh 和ageLow 之间,并且性别应为(输入值)或“N/A”。

4) 获取 field1、field2、field3、field4 与字符串 (nayyar) 匹配的所有文档,并且年龄应在ageHigh 和ageLow 之间,并且性别应为(输入值)或“N/A”,并且 ArrayField 在“atoz”中。

var Schema = new Schema({
lowAge          :   {
                        type: Number, 
                        default: 0 
                    },
highAge         :   {
                        type: Number, 
                        default: 0
                    },
gender          :   {
                        type: String,
                        default: 'N/A'
                    },
field1          :   {
                        type: String
                    },
field2          :   {
                        type: String
                    },
field3          :   {
                        type: String
                    },
field4          :   {
                        type: String
                    },
arrayField      :   {
                        type: [String]
                    }
});


Schema.index({field1:1, field2:1, field3:1, field4:1});
Schema.index({field1:1, field2:1, field3:1, field4:1, arrayField:1,lowAge:1, highAge:1, gender:1,});
Run Code Online (Sandbox Code Playgroud)

这是索引的正确方法吗?

not*_*est 5

首先,在字段上创建索引的想法似乎不错。但是,在查询中使用的所有可能字段上创建索引看起来不正确。

帖子中列出的所有查询都包含这四个字段。如果对这4个字段都创建一个复合索引,我想应该就足够了。

此外,您正在架构级别定义索引。当应用程序启动时,Mongoose 会自动为模式中每个定义的索引调用 EnsureIndex。这可能会导致一些性能影响。

您需要考虑以下事项:-

1) 单字段索引,即每个字段创建四个索引。

例子:

db.collection.createIndex({field1 : 1});
Run Code Online (Sandbox Code Playgroud)

如果您需要按字段 1、字段 2、字段 3 或字段 4 或一个或多个字段的组合查找文档,请选择此选项。

在此选项中,索引是独立的。MongoDB 最终总是会使用索引(即索引之一)。

2)复合索引,即创建一个索引有四个字段

例子:

db.collection.createIndex({field1 : 1, field2 : 1, field3 : 1, field4 :1});
Run Code Online (Sandbox Code Playgroud)

如果您始终拥有 field1,请选择此选项。

如果在任何情况下都没有 field1,MongoDB 就不会使用索引。