在MongoDB中为动态添加的字段创建索引

时间:2014-06-13 12:58:09

标签: dynamic indexing

我有一个MongoDB集合的模式,其中字段动态添加到文档中。当我使用动态添加的字段搜索文档时,查询速度非常慢。 示例文档如下所示:

{
    "_id" : ObjectId("4657439ad7f616df3f49"),
    "name" : "test1",
    "created_at" : ISODate("2014-06-13T10:48:41.501Z"),
    "Status" : "NEW",
    "email":"test@test.com",
    "rank":1278

}

字段名称,电子邮件,排名由用户动态创建并添加到文档中。 查询任何这些领域需要很长时间才能做出响应。由于自然和字段本身是动态添加的,因此不会在这些字段上创建索引。 我试过.explain(),这是输出:

{
    "cursor" : "BasicCursor",
    "isMultiKey" : false,
    "n" : 1,
    "nscannedObjects" : 1683063,
    "nscanned" : 1683063,
    "nscannedObjectsAllPlans" : 1683063,
    "nscannedAllPlans" : 1683063,
    "scanAndOrder" : false,
    "indexOnly" : false,
    "nYields" : 4,
    "nChunkSkips" : 0,
    "millis" : 1708,
    "indexBounds" : {

    }

这清楚地表明需要进行索引编制。但我不知道如何在这些非确定性字段上创建索引。 注*:文档没有所讨论here的嵌入文档。我是MongoDB的新手。

3 个答案:

答案 0 :(得分:1)

您可以在非确定性字段上创建索引。只需使用sparse indexes

db.myCollection.ensureIndex( { "name": 1 }, { sparse: true } );

答案 1 :(得分:1)

从4.2版本开始,MongoDb宣布了“通配符索引”。这就是您要寻找的。这是一个如何创建通配符索引的示例。

db.myCollection.createIndex( { "$**": 1 } );

即使您可以像这样为子文档创建通配符索引:

db.myCollection.createIndex( { "subdocument.$**": 1 } );

有关更多详细信息:https://docs.mongodb.com/manual/core/index-wildcard/

答案 2 :(得分:0)

我不确定Mongo DB,但如果我们谈论任何数据库和表,那么在非确定性字段上创建索引没有问题。它将成为数据库的额外负担..并且您的查询可能会在繁重的重建期间变得缓慢..