多个标识为嵌套对象的字段上的MongoDB索引
我有一个mongoDB集合,其中包含可以通过多个标识方案进行标识的项多个标识为嵌套对象的字段上的MongoDB索引,mongodb,mongodb-query,Mongodb,Mongodb Query,我有一个mongoDB集合,其中包含可以通过多个标识方案进行标识的项 { "identification" : { "SCHEME1" : [ "9181983" ], "SCHEME2" : [ "ABC" , "CDE" ], "SCHEME4" : ["FDE"] } } { "identification" : { "SCHEME2" : [ "LALALAL" ], "SCHEM
{
"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中存在漏洞
有人知道我如何用一个索引索引整个字段“标识”吗?还是我的文档结构错误?欢迎提出任何想法,谢谢。我在一个报告数据库中遇到了同样的问题,该数据库有我想在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"})
缺点是您需要更新您的模式…唯一索引是否仍然可以用于防止重复标识,例如identification.SCHEME2:ABC?无论如何,重建我的收藏不会那么有趣:-)回答我自己的问题,从上面的评论:是的,一把独特的钥匙是完美的。我可以通过一个小批量和java对象模型中的一个增强来改变我的模式。再次感谢。