【问题标题】:Mongo DB Query on List<Map<String, Map<String, String>>>Mongodb 查询 List<Map<String, Map<String, String>>>
【发布时间】:2016-12-30 14:28:06
【问题描述】:

我有如下示例 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"});

我也可以使用上述查询获得结果。

现在我要过滤 subscriptions 数组中的数据,该数组由 "subs_id" = "111" 组成。

我尝试如下

db.testTable.find({"subscriptions.subs_id":"111"});

这没有给我结果。有人可以建议我如何做到这一点。

注意:我知道它是 List > > 格式,我正在查询 Map 对象的值部分。但无法获得任何线索如何获取结果。

【问题讨论】:

  • 您应该尝试通过将订阅更改为嵌入文档列表来修复订阅。像{"subs_key":"12", "subs_id": "111", "state": "5", } 这样的东西,你可以使用db.testTable.find({"subscriber.id":"123", "subscriptions.subs_id":"111"},{"subscriptions.$":1); 找到订阅
  • 同意 sagar 所说的。如果 mongo 有通配符字段名称搜索,那么会有不同的故事,但现在你的文档可能需要调整。为什么用数字标记您的文档?有什么原因吗?
  • 感谢您的意见。但我无法更改来自客户端的输入数据格式。只需要以给定的格式过滤数据..任何没有数据调整的建议都会被应用..!
  • 您只是在示例中缺少键值12db.testTable.find({"subscriptions.12.subs_id":"111"}) 工作。
  • 亲爱的@DaveCoast 请找到更新的 JSON。 subs_id=111 可以有多个值,但其键可以不同。

标签: java json mongodb mongodb-query


【解决方案1】:

也许你可以使用 $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 也很昂贵,因为它不使用索引,它基本上是对所有文档的扫描,因此相对较慢。

还有 我想澄清一下订阅字段基本上是List&lt;Map&lt;String,Map&lt;String,String&gt;&gt;&gt;

【讨论】:

  • 非常感谢,它工作正常。你能建议任何使用 JAVA 代码实现类似查询的链接吗?
  • 好吧,所有的java驱动程序都以一种或另一种方式支持$where,你打算使用哪一种取决于你。如果你想使用 spring-data-mongodb 我找不到一个简单的方法,但是你可以用字符串创建一个 BasicQuery,在 String 中你可以传递我们在 find 参数中的整个子句。例如,请参见第 223 行:github.com/spring-projects/spring-data-mongodb/blob/master/…
猜你喜欢
  • 2020-08-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-22
  • 2020-01-26
  • 1970-01-01
  • 2016-07-21
  • 2020-04-01
  • 2015-11-21
相关资源
最近更新 更多