2013-06-25 4 views
9

Ho un documento "proprietario" che può avere "n" numero di campi e campi hanno "istruttori" e gli istruttori hanno "classi". In precedenza ho provato a realizzare questo con array annidati (vedi link al mio post qui sotto), tuttavia ho appreso che l'operatore posizionale "$" non annida così profondamente. MongoDB: Adding an array into an existing arrayMongoDb: Come inserire oggetti aggiuntivi nella raccolta di oggetti?

Tuttavia, ho imparato che la soluzione alternativa sarebbe utilizzare le raccolte di oggetti anziché gli array. Suppongo di dover utilizzare "aggiornamento" con "$ set" per aggiungere ulteriori "campi", tuttavia ogni volta che faccio tutto ciò che faccio è sovrascrivere (aggiornare) il campo precedente che è stato inserito.

Di seguito si riporta la struttura gerarchica che sto cercando di realizzare:

owner = { 

    firstName: 'john', 
    lastName: 'smith', 
    ownerEmail: '[email protected]', 

    camps : { 

     { 
      name: 'cubs-killeen', 
      location: 'killeen' 
     }, 

     { 
      name: 'cubs-temple', 
      location: 'temple' 
     }, 

     instructors : { 

      { 
       firstName: 'joe', 
       lastName : 'black' 
      }, 

      { 
       firstName: 'will', 
       lastName : 'smith' 
      }   
     } 

    } 

} 

Ho anche provato la seguente:

db.owners.update({ownerEmail:'[email protected]'}, {$set: { camps:{ {name:'cubs-killeen'} } }}) 

ma questo genera un identificatore inaspettato {error.

Qualsiasi aiuto con alcuni comandi di mongo di esempio per ottenere la struttura sopra sarebbe più apprezzato.

V/R

Chris

+1

Questi non sono documenti validi. Non puoi avere oggetti nidificati senza nome come stai cercando di fare con 'camps' e' instructors'. – JohnnyHK

+1

intendevi "campi: {nome: 'cubs-killeen'}' invece di 'campi: {{nome: 'cubs-killeen'}}'? –

+0

@Ristor, sì, è quello che intendevo! grazie per il chiarimento. Ora, come raggiungere quella struttura del documento? – cpeele00

risposta

18

Come altri accennato, la struttura che si desidera non è valido. Raccomando la seguente struttura per il documento il proprietario:

{ 
    "_id" : ObjectId("51c9cf2b206dfb73d666ae07"), 
    "firstName" : "john", 
    "lastName" : "smith", 
    "ownerEmail" : "[email protected]", 
    "camps" : [ 
      { 
        "name" : "cubs-killeen", 
        "location" : "killeen" 
      }, 
      { 
        "name" : "cubs-temple", 
        "location" : "temple" 
      } 
    ], 
    "instructors" : [ 
      { 
        "firstName" : "joe", 
        "lastName" : "black" 
      }, 
      { 
        "firstName" : "will", 
        "lastName" : "smith" 
      } 
    ] 
} 

e poi

db.stack.update(
    { ownerEmail: "[email protected]" }, 
    { 
    $push: { 
     camps: { name: "cubs-killeen", location: "some other Place" } 
    } 
    } 
); 

Avendo questo, è possibile aggiungere i campi come questo:

Spero che aiuta.

+0

hmmm, come potrei quindi associare un istruttore con un campo? E poi lezioni con l'istruttore (dal momento che diversi istruttori insegnano classi diverse)? Questo approccio sembra prendere il via dai vantaggi del Rich Document di Mongo. Forse dovrei usare semplicemente Mongoose e progettarlo in modo relazionale. Grazie per la risposta :-) – cpeele00

+2

Quindi, un campo può avere diversi istruttori? In tal caso, metti la lista degli "istruttori" all'interno di ciascun campo nei "campi". Puoi renderlo una serie di stringhe per semplicità come questa: '" istruttori ": [" Joe Black "," Will Smith "," Some Other "]'. Se si desidera memorizzare più informazioni sugli istruttori, creare una nuova raccolta "istruttori" e avere il nome come ID. '{" _id ":" Joe Black "," age ": 21," phone ":" 123 "}'. Prova a pensare sulla semplicità e su come i tuoi dati verranno interrogati prima di considerare di pensare su Relazionale. NoSQL (NoRelational) è difficile da catturare nella tua mente ma ti ripaga quando lo fai. – AntonioOtero