2016-12-30 104 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 –

相關問題