2012-02-15 20 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 
       } 
      ] 
     } 
    ] 
} 

en la recolección anterior (es decir, países) tengo un solo documento, y quiero obtener los detalles acerca de un estado en particular (digamos "country.states.name": "Orissa") , pero yo quiero que mi resultado como aquí bajo en lugar de todo el documento .IS hay una manera en Mogo ...seleccionar sólo subdocumentos o matrices

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

Gracias

Respuesta

2

Cualquier consulta en mongodb siempre volver documento raíz.

Sólo hay un camino para que cargue un documento secundario con los padres a través de $slice si conoce el número ordinal del Estado en matriz anidada:

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

$ trabajo rebanada en orden por defecto (como documentos se insertó en matriz anidada). Además, si usted no necesita campos de un país puede incluir solamente _id y estados de resultado:

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

Entonces documento son el resultado se parece a éste:

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

¿Entonces podemos escribir un procedimiento en Mongo donde podríamos obtener primero el número ordinal del estado y luego usar $ slice? – John

+0

@John: No, pero puede agregar 'id' a cada estado igual al número ordinal de estado cuando inserte el país en la base de datos. Y luego use esta identificación para cargar un estado particular. –

5

No se puede hacer en este momento, pero usted podrá $ unwind en el aggregation framework. Puedes probarlo ahora con la rama experimental 2.1, la versión estable saldrá en 2.2, probablemente en unos pocos meses.

+0

Aquí está el ticket jira relacionado con esto: https://jira.mongodb.org/browse/SERVER-828 – Ross

7

intentado esto:

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

Y tiene:

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

Si no desea utilizar aggregate, puede hacerlo con bastante facilidad en la capa de aplicación mediante subrayado (incluido por defecto):

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

Esto le dará el registro completo del estado que coincide con statename. Muy conveniente.

Cuestiones relacionadas