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

Dynamic 在MongoDB中动态添加的字段上创建索引,dynamic,indexing,Dynamic,Indexing,我有一个MongoDB集合的模式,其中字段被动态添加到文档中。当我搜索带有动态添加字段的文档时,查询速度非常慢。 示例文档如下所示: { "_id" : ObjectId("4657439ad7f616df3f49"), "name" : "test1", "created_at" : ISODate("2014-06-13T10:48:41.501Z"), "Status" : "NEW", "email":"test@test.com", "r

我有一个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" : {

    }
这清楚地表明有必要建立索引。但我不知道如何在这些非确定性字段上创建索引。
注*:该文件没有所讨论的嵌入文件。我是MongoDB新手。

您可以在非确定性字段上创建索引。就用吧


我不确定MongoDB,但如果我们讨论任何数据库和表,那么在非确定性字段上创建索引就没有问题了。这将是DB的额外负担。。而且您的查询在大量检索期间可能会变慢。

从4.2版MongoDb宣布的“通配符索引”开始。这就是你要找的。下面是一个如何创建通配符索引的示例

db.myCollection.createIndex( { "$**": 1 } );
甚至可以为子文档创建通配符索引,如下所示:

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

有关更多详细信息:

如果在动态添加之前不知道已添加的文件“名称”,如何对其进行索引。。。如果您正在寻找自动化,并且用户可以添加任何字段,那么您可以在为正在搜索的每个字段运行查询之前确保索引。第一次之后,ensureIndex命令没有效果,重复该命令是无害的。当然,这可能导致一个包含N个索引的集合。这是一种交换。
db.myCollection.createIndex( { "subdocument.$**": 1 } );