蒙戈DB查询上列表<地图<字符串,地图<字符串,字符串>>>
我有如下样品JSON。蒙戈DB查询上列表<地图<字符串,地图<字符串,字符串>>>
{
"subscriber": {
"id": "123",
"custom_field1": "0",
"custom_field2": "0"
},
"subscriptions": [{
"12": {
"subs_id": "111",
"state": "5",
}
}, {
"13": {
"subs_id": "222",
"state": "8",
}, {
"14": {
"subs_id": "111",
"state": "8",
}
}]
}
我能够在蒙戈DB查询像
db.testTable.find({ “subscriber.id”: “123”});
而且我能够使用上述查询得到结果。
现在我想阵列包括“subs_id”过滤数据上订阅=“111”。
我试图像下面
db.testTable.find({ “subscriptions.subs_id”: “111”});
这是不给我结果。有人可以建议我如何做到这一点。
注:据我了解,它在列表<地图<字符串,地图<字符串,字符串>>>格式,我查询地图对象的值部分。但无法得到任何线索如何获取结果。
也许你可以使用$其中
db.testTable.find({$where : "for(var i in this.subscriptions){for(var j in this.subscriptions[i]){if(this.subscriptions[i][j]['subs_id'] && this.subscriptions[i][j]['subs_id'] === '111'){return true;}}}"});
不要骂我,数据库设计是错误的海事组织。您可能需要重新考虑您的数据库结构以获得高效且“愉快”的查询。
$where也是昂贵的,因为它不使用索引,它基本上所有的文件,因此比较缓慢的扫描。
而且 我想澄清的是订阅场基本上是List<Map<String,Map<String,String>>>
非常感谢,它的工作正常。你可以建议使用JAVA代码实现类似查询的任何链接。 – Manindar
那么,所有的java驱动程序都支持$在哪个方面或哪一方面,你打算使用哪一个取决于你。如果你想使用spring-data-mongodb,我找不到一个简单的方法,但是你可以用String创建一个BasicQuery,在String中你可以传递我们在里面找到的全部子句。作为示例,请参阅行号223:https://github.com/spring-projects/spring-data-mongodb/blob/master/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/库/查询/ StringBasedMongoQueryUnitTests.java –
你应该尝试通过改变它列出嵌入文档的固定订阅。像这样'{ “subs_key”: “12”, “subs_id”: “111”, “状态”: “5”, }',你可以找到使用'db.testTable.find认购({” subscriber.id“:”123“,”subscriptions.subs_id“:”111“},{”subscriptions。$“:1);' – Veeram
同意sagar的说法。如果mongo会有通配符字段名称搜索,那么会有一个不同的故事,但现在您的文档可能需要调整。为什么要用数字标记文档?有原因吗? –
感谢您的意见。但是我无法改变输入数据格式,因为它来自客户端。只需要以给定的格式过滤数据。没有数据调整的任何建议appriciated ..! – Manindar