我有一个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的新手。
答案 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,但如果我们谈论任何数据库和表,那么在非确定性字段上创建索引没有问题。它将成为数据库的额外负担..并且您的查询可能会在繁重的重建期间变得缓慢..