Java Mongo DB查询列表<;地图<;字符串,Map<;字符串,字符串>&燃气轮机&燃气轮机;

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

我有下面的JSON示例

{
        "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行: