2013-12-24 3 views
0

как реализовать следующее: * найти значение data3 где id = "ID1" и region = "RegionA" и indicator_id "= 1 * (результат должен быть точно:" A ") коллекция:find query array массивов в mongo

{ 
    "id" : "ID1", 
    "data1" : 
    [ 
     { 
      "region" : "RegionA", 
      "data2" : [ 
       { 
        "indicator_id" : 1, 
        "data3" : "A" 
       }, 
       { 
        "indicator_id" : 2, 
        "data3" : "B" 
       }, 
       { 
        "indicator_id" : 3, 
        "data3" : "C" 
       }, 
       { 
        "indicator_id" : 4, 
        "data3" : "D" 
       } 
      ] 
     }, 
     { 
      "region" : "RegionB", 
      "data2" : [ 
       { 
        "indicator_id" : 5, 
        "data3" : "A" 
       }, 
       { 
        "indicator_id" : 6, 
        "data3" : "B" 
       }, 
       { 
        "indicator_id" : 7, 
        "data3" : "C" 
       }, 
       { 
        "indicator_id" : 8, 
        "data" : "D" 
       } 
      ] 
     } 
    ] 
} 

не использовать $, где, как она неэффективна

следующие работы, но вернуть все „

Elements региональных веб“ (который не является ожидаемым результатом) и использует «[0] .data1 [0] .data2 [0] .data3 'для проекта "A":

db.elements.find({id:"ID1"},{data1 : { $elemMatch: { data2: {$elemMatch: { indicator_id:1}}}}})[0].data1[0].data2[0].data3 

ответ

0

Привет, вы можете попробовать следующее

db.test1.find({id:"ID1",data1:{$elemMatch: { region:"RegionA"}}, "data1.data2.indicator_id":1 }) 

надеюсь, что это то, что вы ищете.

+0

не работает для меня. Я думаю, мне нужно использовать $ elemMatch дважды, так как я использую массив в массиве. Я пришел к выводу, что эта модель ошибочна в первую очередь (для Mongo) – Elad

+0

Я не уверен, почему это не сработало для вас, но я взял документ со своего поста и выполнил над запросом, и он отлично работает, и я также попробуйте с одним условием из 3 условий, он также отлично работает. – nish71

0

Прежде всего, вы поняли, что модель данных может быть неправильной. Похоже, вы пытаетесь сохранить SQL как таблицы, а просто вложенные отношения в качестве поддокументов. Проблема в том, что вы пытаетесь сделать запросы глубоко в этих поддокументах. Что вам нужно, так это применить оператор «$ elemMatch» к поддокументам, но это не поддерживается. См. https://jira.mongodb.org/browse/SERVER-831 И даже если бы это было подтверждено, запросы были бы слишком сложными, и вам было бы сложно объявить индексы для таких данных.

В качестве альтернативы текущему запросу вы можете использовать структуру агрегации.

db.elements.aggregate([{"$match":{"id":"ID1"}},{"$unwind":"$data1"},{"$unwind":"$data1.data2"},{"$match":{"data1.region":"RegionA","data1.data2.indicator_id":1}},{"$project":{"answer":"$data1.data2.data3","_id":0}}]).result 

[ { "answer" : "A" } ] 

Даже если выше запрос агрегации работает и может быть хорошо для небольшого количества данных, я предлагаю вам посмотреть на запросы, которые необходимо выполнить и моделировать свои данные соответственно.

Например, если приведенный выше ваш наиболее важный запрос, вы можете захотеть иметь один документ на элемент 'data3'. Ваши данные будут выглядеть документы, которые вы видите, как только пробежки $ 2 размотать команды в приведенном выше запросе агрегации:

{ 
     "_id" : ObjectId("52caeb934c735353309cf068"), 
     "id" : "ID1", 
     "region" : "RegionA", 
     "indicator_id" : 1, 
     "data3" : "A" 
    }, 
    { 
     "_id" : ObjectId("52caeb934c735353309cf068"), 
     "id" : "ID1", 
     "region" : "RegionA", 
     "indicator_id" : 2, 
     "data3" : "B" 
    }, 
    ... 

Чтобы узнать больше о моделировании, смотреть презентации с MongoDB. Перейти к http://www.mongodb.com и выполнить поиск 'data data modeling'