具有多个标识作为嵌套对象的字段上的MongoDB索引

时间:2015-10-15 13:04:55

标签: mongodb mongodb-query

我有一个mongoDB集合,其中包含可通过多种识别方案识别的项目

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

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

项目很可能没有所有识别方案,有些(如上例所示)1-2-4其他可能有不同的识别方案。识别方案的数量最终没有定义并且会增长。每个身份证明只能存在一次。

我想执行两个不同的查询:

使用方案和标识查找项目,例如

 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 个答案:

答案 0 :(得分:1)

我在报告数据库中遇到了同样的问题,该数据库具有我想在find子句中使用的维度。解决方案是使用固定字段将数据保存为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"})

下行是您需要更新架构......