2014-06-13 113 views
1

我有一個MongoDB集合的模式,其中字段被動態地添加到文檔中。當我使用動態添加的字段搜索文檔時,查詢速度非常慢。 樣本文件看起來象下面這樣:在MongoDB中動態添加的字段上創建索引

{ 
    "_id" : ObjectId("4657439ad7f616df3f49"), 
    "name" : "test1", 
    "created_at" : ISODate("2014-06-13T10:48:41.501Z"), 
    "Status" : "NEW", 
    "email":"[email protected]", 
    "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

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

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

如果直到它被動態添加時未知,那麼如何添加已提交的「名稱」的索引? – Astro

+1

好吧...如果您正在尋找自動化功能,並且用戶可以添加任何字段,那麼您可以在對正在搜索的每個字段運行查詢之前確保索引。在第一次之後,ensureIndex命令不起作用,並且重複無害。當然,這可能導致帶有N個索引的集合。這是一種折衷。 – amenadiel

0

我不知道蒙戈DB,但如果我們談論任何數據庫和表則沒有問題,能夠產生出對非確定性的字段的索引。它將會對DB造成額外的負擔..並且在重審期間您的查詢可能會變得緩慢。