2012-02-15 3 views
5
{ 
    "_id":{ 
     "oid":"4f33bf69873dbc73a7d21dc3" 
    }, 
    "country":"IND", 
    "states":[{ 
      "name":"orissa", 
      "direction":"east", 
      "population":41947358, 
      "districts":[{ 
        "name":"puri", 
        "headquarter":"puri", 
        "population":1498604 
       }, 
       { 
        "name":"khordha", 
        "headquarter":"bhubaneswar", 
        "population":1874405 
       } 
      ] 
     }, 
     { 
      "name":"andhra pradesh", 
      "direction":"south", 
      "population":84665533, 
      "districts":[{ 
        "name":"rangareddi", 
        "headquarter":"hyderabad", 
        "population":3506670 
       }, 
       { 
        "name":"vishakhapatnam", 
        "headquarter":"vishakhapatnam", 
        "population":3789823 
       } 
      ] 
     } 
    ] 
} 

В приведенных выше коллекции (т.е. страны) у меня есть только один документ, и я хочу получать подробности о конкретном состоянии (позволяет сказать «country.states.name»: «Орисса») , Но я хочу, чтобы мой результат, как здесь под вместо всего документа. там путь в Мом ...выбрать только поддокументы или массивы

 { 
    "name": "orissa", 
    "direction": "east", 
    "population": 41947358, 
    "districts": [ 
     { 
      "name": "puri", 
      "headquarter": "puri", 
      "population": 1498604 
     }, 
     { 
      "name": "khordha", 
      "headquarter": "bhubaneswar", 
      "population": 1874405 
     } 
    ] 
    } 

Благодарности

ответ

2

Любого запроса в MongoDB всегда возвращаю корневой документ.

Существует только один способ для вас, чтобы загрузить один вспомогательный документ с родителем через $slice если вы знаете порядковый номер состояния в вложенном массиве:

// skip ordinalNumberOfState -1, limit 1 
db.countries.find({_id: 1}, {states:{$slice: [ordinalNumber -1 , 1]}}) 

$ ломтика работу в порядке по умолчанию (как документы были вставлены в вложенный массив). Кроме того, если вам не нужны поля из страны, вы можете включить только _id и состояний в результате:

db.countries.find({_id: 1}, {states:{$slice: [ordinalNumber -1 , 1]}, _id: 1}) 

Тогда результирующий документ будет выглядит как этот:

{ 
    "_id":{ 
     "oid":"4f33bf69873dbc73a7d21dc3" 
    }, 
    "states":[{ 
      "name":"orissa", 
      "direction":"east", 
      "population":41947358, 
      "districts":[{ 
        "name":"puri", 
        "headquarter":"puri", 
        "population":1498604 
       }, 
       { 
        "name":"khordha", 
        "headquarter":"bhubaneswar", 
        "population":1874405 
       } 
      ] 
     }] 
} 
+0

Затем мы можем написать процедуру в Монго, где сначала можем получить порядковый номер состояния, а затем использовать $ slice? – John

+0

@John: Нет, но вы можете добавить 'id' в каждое состояние, равное порядковому числу состояний при вставке страны в базу данных. И затем используйте этот идентификатор для загрузки определенного состояния. –

5

Вы не можете сделать это прямо сейчас, но вы сможете с $ расслабиться в aggregation framework. Вы можете попробовать это сейчас с экспериментальной ветвью 2.1, стабильная версия выйдет в 2.2, вероятно, через несколько месяцев.

+0

Heres the jira ticket, относящийся к этому: https://jira.mongodb.org/browse/SERVER-828 – Ross

7

Пробовал так:

db.countries.aggregate(  
    { 
     "$project": { 
      "state": "$states", 
      "_id": 0 
     } 
    }, 
    { 
     "$unwind": "$state" 
    }, 
    { 
     "$group": { 
      "_id": "$state.name", 
      "state": { 
       "$first": "$state" 
      } 
     } 
    }, 
    { 
     "$match": { 
      "_id": "orissa" 
     } 
    } 
); 

И получил:

{ 
    "result" : [ 
      { 
        "_id" : "orissa", 
        "state" : { 
          "name" : "orissa", 
          "direction" : "east", 
          "population" : 41947358, 
          "districts" : [ 
            { 
              "name" : "puri", 
              "headquarter" : "puri", 
              "population" : 1498604 
            }, 
            { 
              "name" : "khordha", 
              "headquarter" : "bhubaneswar", 
              "population" : 1874405 
            } 
          ] 
        } 
      } 
    ], 
    "ok" : 1 
1
db.countries.find({ "states": { "$elemMatch": { "name": orissa }}},{"country" : 1, "states.$": 1 }) 
0

Если вы не хотите использовать aggregate, вы можете сделать это довольно легко на прикладном уровне с помощью подчеркивания (включены по умолчанию):

var country = Groops.findOne({"property":value); 
var state _.where(country, {"state":statename}); 

Это даст вам полную государственную запись, которая соответствует statename. Очень удобно.

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