2016-12-30 106 views
0

我有如下样品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”});

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

注:据我了解,它在列表<地图<字符串,地图<字符串,字符串>>>格式,我查询地图对象的值部分。但无法得到任何线索如何获取结果。

+0

你应该尝试通过改变它列出嵌入文档的固定订阅。像这样'{ “subs_key”: “12”, “subs_id”: “111”, “状态”: “5”, }',你可以找到使用'db.testTable.find认购({” subscriber.id“:”123“,”subscriptions.subs_id“:”111“},{”subscriptions。$“:1);' – Veeram

+0

同意sagar的说法。如果mongo会有通配符字段名称搜索,那么会有一个不同的故事,但现在您的文档可能需要调整。为什么要用数字标记文档?有原因吗? –

+0

感谢您的意见。但是我无法改变输入数据格式,因为它来自客户端。只需要以给定的格式过滤数据。没有数据调整的任何建议appriciated ..! – Manindar

回答

2

也许你可以使用$其中

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>>>

+0

非常感谢,它的工作正常。你可以建议使用JAVA代码实现类似查询的任何链接。 – Manindar

+0

那么,所有的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 –

相关问题