【问题标题】:Indexing in mongoose documents猫鼬文档中的索引
【发布时间】:2017-01-26 01:05:40
【问题描述】:

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

我有以下情况:

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

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

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

4) 获取 field1,field2,field3,field4 与字符串 (nayyar) 匹配且年龄应介于 ageHigh 和 ageLow 之间且性别应为 (输入值) 或 'N/A' AND ArrayField in '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,});

这是正确的索引方式吗?

【问题讨论】:

    标签: node.js mongodb mongoose mongoose-schema


    【解决方案1】:

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

    帖子中列出的所有查询都包含四个字段。如果您在所有这 4 个字段上创建复合索引,我认为应该足够了。

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

    您需要考虑以下几点:-

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

    例子:

    db.collection.createIndex({field1 : 1});
    

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

    在此选项中,索引是独立的。 MongoDB 将始终使用索引(即其中一个索引)。

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

    例子:

    db.collection.createIndex({field1 : 1, field2 : 1, field3 : 1, field4 :1});
    

    如果您总是使用 field1,请选择此选项。

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

    【讨论】:

    • 我将通过运行脚本立即进行收集。因此插入数据期间的性能不是问题。是的,我将在所有情况下都有四个字段,而其他字段则在不同的情况下出现。如果我不在年龄和性别字段上添加索引,它对性能有什么影响吗?我将有 250,000 个文档需要查询。
    • 按四个字段过滤数据后,我假设您不会有 250,0000 个文档。您将拥有总数的一小部分,通常 MongoDB 应该可以在没有索引的情况下处理它。我从未见过在索引中添加的文档中的所有字段。当然,这是不正确的。
    • 感谢您的宝贵时间,这对我很有帮助。
    • 很高兴为您提供帮助!如果有用,我可以要求接受答案吗?
    • 我想与您分享我的代码和实际查询以供审核。有没有办法做到这一点?
    猜你喜欢
    • 2014-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-28
    • 2012-11-07
    • 2020-08-12
    • 2014-05-29
    • 2021-02-11
    相关资源
    最近更新 更多