Index

如何在 MongoDB 中索引動態屬性

  • January 4, 2020

我在 MongoDB 中有以下類型的數據(從我的真實案例中簡化了一點):

{
   "name":"some name",
   "attrs":[
       {"n":"subject","v":"Some subject"},
       {"n":"description","v":"Some great description"},
       {"n":"comments","v":"Comments are here!"},
       ]
}

attrs 數組是動態屬性的容器,即我事先並不知道放在那裡的是什麼類型的屬性。n 代表名稱,v 代表值。

MongoDB In Action 一書將其描述為在屬性完全可預測的情況下具有動態屬性的解決方案。它還描述了您可以像這樣對其進行索引:

db.mycollection.ensureIndex({"attrs.n":1, "attrs.v":1})

然後可以像這樣進行查詢:

db.mycollection.find({attrs: {$elemMatch: {n: "subject", v: "Some subject"}}})

當我測試這個時,我的表現很差。我用擁有 200 萬個文件且沒有索引的 mycollection 進行測試似乎表現更好。

那麼,問題來了,有沒有辦法對這種動態屬性設置進行索引,以便索引提供良好的性能?就我而言,僅使用“主題”和“描述”之類的鍵並將它們全部索引是不可行的…

我還在mongodb-user mailing list上問了同樣的問題(以稍微擴展的形式) ,我得到了答案。從那裡閱讀以獲取更多詳細資訊。簡短的回答是,問題中使用的策略應該可以正常工作,但是有一個問題使它非常低效。希望這個問題能很快得到解決。

對於我的情況,我只需要查詢元組 {n,v} 的完全匹配,所以我可以創建一個多鍵索引:

db.mycollection.ensureIndex({"attrs":1})

並讓他們像這樣查詢:

db.mycollection.find({"attrs": {n: "subject", v: "Some subject"}})

效果很好並且非常有效地使用索引。

在這裡問了同樣的問題。從 4.2 版本的 MongoDB 開始,他們宣布了萬用字元索引。這是一個例子:

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

引用自:https://dba.stackexchange.com/questions/13661