2016-12-30 5 views
0

У меня есть образец JSON, как показано ниже.Mongo DB Query on List <Map <String, Map <String, String >>>

{ 
     "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"});

, который не дает мне результатов. Может кто-нибудь подскажет мне, как это сделать.

Примечание: Я понимаю, что его в Список < < Карта String, Map < String, String>>> формат и я запрашивая на стоимость части объекта на карте. Но не в состоянии понять, как получить результаты.

+0

вы должны попробовать фиксации подписки, изменив его в список вложенных документов. что-то вроде этого '{" subs_key ":" 12 ", " subs_id ":" 111 ", " state ":" 5 ", }' и вы можете найти подписку, используя 'db.testTable.find ({ «подписчики»: «123», «subscriptions.subs_id»: «111»}, {«subscriptions. $»: 1); ' – Veeram

+0

согласен с тем, что сказал сагар. если у mongo будет поиск имени поля wild card, тогда будет другая история, но прямо сейчас ваш документ, вероятно, нуждается в настройке. зачем маркировать ваши документы цифрами? есть ли причина? –

+0

Спасибо за ввод. Но я не могу изменить формат входных данных, поскольку он исходит от клиента. Просто нужно отфильтровать данные в указанном формате .. Любые предложения без настройки данных оцениваются ..! – 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;}}}"}); 

Не проклинать меня, дизайн БД неисправен имо. Возможно, вам понадобится переосмыслить структуру db для эффективных и «приятных» запросов.

$where также является дорогостоящим, так как он не использует индекс, это в основном проверка на весь документ, следовательно, сравнительно медленная.

Также я хотел бы уточнить, что поле подписки в основном List<Map<String,Map<String,String>>>

+0

Большое спасибо, он работает отлично. вы можете предложить любую ссылку для реализации аналогичного запроса с использованием кода JAVA. – Manindar

+0

Ну, все драйверы java поддерживают $, где так или иначе, какой из них вы планируете использовать, зависит от вас. в случае, если вы хотите использовать spring-data-mongodb, я не мог найти простой способ, но вы можете создать BasicQuery со строкой, в String вы можете передать целое предложение, которое у нас есть внутри параметра find. в качестве примера см. номер строки 223: https://github.com/spring-projects/spring-data-mongodb/blob/master/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/ хранилище/запрос/StringBasedMongoQueryUnitTests.java –

Смежные вопросы