Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
多个标识为嵌套对象的字段上的MongoDB索引_Mongodb_Mongodb Query - Fatal编程技术网

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

多个标识为嵌套对象的字段上的MongoDB索引,mongodb,mongodb-query,Mongodb,Mongodb Query,我有一个mongoDB集合,其中包含可以通过多个标识方案进行标识的项 { "identification" : { "SCHEME1" : [ "9181983" ], "SCHEME2" : [ "ABC" , "CDE" ], "SCHEME4" : ["FDE"] } } { "identification" : { "SCHEME2" : [ "LALALAL" ], "SCHEM

我有一个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中存在漏洞


有人知道我如何用一个索引索引整个字段“标识”吗?还是我的文档结构错误?欢迎提出任何想法,谢谢。

我在一个报告数据库中遇到了同样的问题,该数据库有我想在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对象模型中的一个增强来改变我的模式。再次感谢。