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

Nella raccolta di cui sopra (cioè paesi) ho solo un documento, e voglio recuperare i dettagli su un particolare stato (diciamo "country.states.name": "orissa") , ma io voglio che il mio risultato qui sotto invece di tutto il documento .è c'è un modo in Mogo ...selezionare solo documenti secondari o array

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

Grazie

risposta

2

Qualsiasi query in MongoDB tornare sempre documento radice.

C'è solo un modo per caricare un documento sub con i genitori tramite $slice se si conosce il numero ordinale di Stato in array nidificato:

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

$ lavoro fetta in modo predefinito (come documenti è stato inserito in matrice annidata). Anche se non hai bisogno di campi da un paese è possibile includere solo _id e segnala nel risultato:

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

Poi risultato documento volontà osserva come questo:

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

Quindi possiamo scrivere una procedura in Mongo dove potremmo ottenere prima il numero ordinale dello stato e poi usare $ slice? – John

+0

@John: No, ma puoi aggiungere 'id' a ogni stato uguale al numero ordinale di stato quando inserisci il paese nel database. E quindi utilizzare questo ID per caricare uno stato particolare. –

5

Non si può fare in questo momento, ma sarai in grado di $ unwind nel aggregation framework. Puoi provarlo ora con il ramo sperimentale 2.1, la versione stabile uscirà nel 2.2, probabilmente tra qualche mese.

+0

Ecco il biglietto jira relativo a questo: https://jira.mongodb.org/browse/SERVER-828 – Ross

7

provato questo:

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

e ottenuto:

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

Se non si desidera utilizzare aggregate, si può farlo abbastanza facilmente a livello di applicazione utilizzando sottolineatura (incluso per impostazione predefinita):

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

Questo ti darà l'intero record di stato che corrisponde a statename. Molto conveniente.

Problemi correlati