2015-10-15 69 views
1

我有一個包含項的MongoDB的集合,可以通過多種標識方案MongoDB的指數上有多個標識字段嵌套對象

{ 
    "identification" : { 
     "SCHEME1" : [ "9181983" ], 
     "SCHEME2" : [ "ABC" , "CDE" ], 
     "SCHEME4" : ["FDE"] 
    } 
} 

{ 
    "identification" : { 
     "SCHEME2" : [ "LALALAL" ], 
     "SCHEME5" : [ "CH98790789879" ] 
    } 
}, 

的項目將極有可能不是所有的標識方案,一些有標識(如上面的例子)1-2-4其他可能有不同的。識別方案的數量還沒有最終確定,並且會增長。每個標識只能存在一次。

欲執行兩個不同的查詢:

SEACH的項目與方案和鑑定,例如

db.item.find({"identification.SCHEME2": "CDE"}) 

使用特定識別方案(例如,

db.item.find({"identification.SCHEME2": {$exists: true}}) 

我的做法是創建稀疏索引:

db.item.createIndex({ identification.SCHEME1: 1 }, { sparse: true, unique: true}); 
db.item.createIndex({ identification.SCHEME2: 1 }, { sparse: true, unique: true }); 
db.item.createIndex({ identification.SCHEME3: 1 }, { sparse: true, unique: true }); 
and so on .... 

這種做法非常完美,直到我發現有在MongoDB中a limit of 64 indexes on one collection

有沒有人有一個想法,我怎麼可以索引整個領域「鑑定」與一個指數?或者我的文檔結構錯了?歡迎任何想法,謝謝。

回答

1

我在報表數據庫中遇到了同樣的問題,該報表數據庫中有我想要在查找子句中使用的維數。解決方案是使用一個固定字段來保存數據作爲k/v對,並在其上進行索引。 你的情況:

{ 
    "identification" : [ 
     {"k":"SCHEME1", "v":[ "9181983" ]}, 
     {"k":"SCHEME2", "v":[ "ABC" , "CDE" ]}, 
     {"k":"SCHEME4", "v":["FDE"]} 
    ] 
} 

如果你現在在{"identification.k":1, "identification.v":1}建立複合索引您就可以使用索引搜索它:

db.item.find({"identification.k":"SCHEME2", "identification.v":"CDE"}) 

缺點是你需要更新你的架構......

+0

獨特的索引是否仍然適用於防止重複標識,例如識別.SCHEME2:ABC?如何,重建我的收藏將不會那麼有趣:-) – mmx73

+0

回答我自己的問題形式上面的評論:是的,一個獨特的關鍵作品完美。我的模式的改變可以用一個小批量和我的java對象模型中的增強來完成。再次感謝。 – mmx73