Java Mongo DB查询列表<;地图<;字符串,Map<;字符串,字符串>&燃气轮机&燃气轮机;
我有下面的JSON示例Java Mongo DB查询列表<;地图<;字符串,Map<;字符串,字符串>&燃气轮机&燃气轮机;,java,json,mongodb,mongodb-query,Java,Json,Mongodb,Mongodb Query,我有下面的JSON示例 { "subscriber": { "id": "123", "custom_field1": "0", "custom_field2": "0" }, "subscriptions": [{ "12": { "subs_id": "111", "state": "5
{
"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",
}
}]
}
我可以像这样查询Mongo DB
db.testTable.find({“subscriber.id”:“123”})强>
我也可以通过上面的查询得到结果
现在我想过滤订阅数组中的数据,该数组由的“subs\u id”=“111”组成
我试着像下面一样
db.testTable.find({“subscriptions.subs_id”:“111”})强>
这并没有给我结果。谁能建议我怎么做
注意:我知道它是列表格式,我正在查询Map对象的值部分。但是无法获取任何关于如何获取结果的线索。也许您可以使用$where
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
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;}}}"});
不要诅咒我,数据库设计在我看来是错误的。你可能需要重新考虑你的数据库结构,以实现高效和“愉快”的查询
也很昂贵,因为它不使用索引,它基本上是对所有文档的扫描,因此速度相对较慢
也
我想澄清一下,订阅字段基本上是
List
,您应该尝试通过将其更改为嵌入文档列表来修复订阅。类似这样的{“subs_key”:“12”,“subs_id”:“111”,“state”:“5”,}
您可以使用db.testTable.find({“subscriber.id”:“123”,“subscriptions.subs_id”:“111”},{“subscriptions.$”:1)找到订阅
同意sagar所说的。如果mongo使用通配符字段名搜索,则会出现不同的情况,但现在您的文档可能需要调整。为什么要用数字标记文档?有原因吗?感谢您的输入。但我无法更改输入数据格式,因为它来自客户端。只需要过滤数据ta的格式是给定的..任何不进行数据调整的建议都将被接受..!您只是缺少示例中的键值12
。db.testTable.find({“subscriptions.12.subs_id:“111”})
有效。亲爱的@DaveCast请找到更新的JSON。可以有多个subs_id=111的值,但其键可以不同。您应该尝试通过将其更改为嵌入文档列表来修复订阅。类似于以下内容{“subs_key”:“12”,“subs_id”:“111”,“state”:“5”,}
您可以使用db.testTable.find({“subscriber.id”:“123”,“subscriptions.subs\u id”:“111”},{“subscriptions.$”:1)找到订阅
同意sagar所说的。如果mongo使用通配符字段名搜索,则会出现不同的情况,但现在您的文档可能需要调整。为什么要用数字标记文档?有原因吗?感谢您的输入。但我无法更改输入数据格式,因为它来自客户端。只需要过滤数据ta的格式是给定的..任何不进行数据调整的建议都将被接受..!您只是缺少示例中的键值12
。db.testTable.find({“subscriptions.12.subs_id:“111”})
有效。亲爱的@DaveCast请查找更新的JSON。可以有多个subs_id=111的值,但其键可以不同。非常感谢,它工作正常。您可以建议使用JAVA代码实现类似查询的任何链接。好的,所有JAVA驱动程序都以某种方式支持$where,您计划使用哪一个取决于您。以防万一如果你想使用spring data mongodb,我找不到一个简单的方法,但是你可以用string创建一个BasicQuery,在string中,你可以传递我们在find参数中包含的整个子句。作为一个例子,请参阅第223行:非常感谢,它工作得很好。你能建议使用JAVA代码实现类似查询的链接吗ll java驱动程序以某种方式支持$where,您计划使用哪一种取决于您。如果您想使用spring data mongodb,我找不到简单的方法,但您可以使用string创建BasicQuery,在string中,您可以传递我们在find参数中包含的整个子句。例如,请参阅第223行: