2013-06-25 4 views
9

Ich habe ein Dokument "Besitzer", die "n" Anzahl von Lagern haben kann und Lager haben "Ausbilder" und Ausbilder haben "Klassen". Früher habe ich versucht, dies mit geschachtelten Arrays zu erreichen (siehe Link zu meinem Post unten), aber ich habe gelernt, dass der positionelle Operator "$" nicht so tief nistet. MongoDB: Adding an array into an existing arrayMongoDb: Wie fügt man ein zusätzliches Objekt in die Objektsammlung ein?

Allerdings habe ich gelernt, dass die Problemumgehung wäre, Objektkollektionen anstelle von Arrays zu verwenden. Ich gehe davon aus, dass ich "update" mit "$ set" verwenden muss, um zusätzliche "camps" hinzuzufügen, aber jedes Mal, wenn ich das mache, wird das vorher eingefügte Camp überschrieben (aktualisiert).

Unten ist die hierarchische Struktur I zu erreichen versuche:

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' 
      }   
     } 

    } 

} 

Ich habe auch die folgende versucht:

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

aber dies wirft einen unerwarteten Bezeichner {Fehler.

Jede Hilfe mit einigen Beispiel-Mongo-Befehlen, um die obige Struktur zu erreichen, würde am meisten geschätzt werden.

V/R

Chris

+1

Das sind keine gültigen Dokumente. Sie können keine namenlosen verschachtelten Objekte haben, wie Sie es mit Camps und Instructors versuchen. – JohnnyHK

+1

meinst du 'camps: {name:' cubs-killeen '} 'anstelle von' camps: {{name:' cubs-killeen '}} '? –

+0

@Relfor, ja das ist was ich meinte! Danke fürs klarstellen. Wie kann man diese Dokumentenstruktur erreichen? – cpeele00

Antwort

18

Wie andere erwähnt, ist die Struktur, die Sie wollen, ist nicht gültig. ich die folgende Struktur für Ihre Eigentümer Dokument empfehlen:

{ 
    "_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" 
      } 
    ] 
} 

und dann

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

diese haben, können Sie Lager wie folgt hinzufügen:

Hoffe, es hilft.

+0

hmmm, wie würde ich dann einen Ausbilder mit einem Camp verbinden? Und dann Klassen mit dem Ausbilder (da verschiedene Ausbilder verschiedene Klassen unterrichten)? Dieser Ansatz scheint einen Weg aus den Rich Document-Vorteilen von Mongo zu nehmen. Vielleicht sollte ich einfach Mungo verwenden und das auf relationale Weise gestalten. Danke für die Antwort :-) – cpeele00

+2

Also kann ein Camp mehrere Instruktoren haben? In diesem Fall sollten Sie die "Instruktoren" -Liste in jedem Camp in "Camps" eintragen. Sie können es aus Gründen der Einfachheit zu einem Array von Strings machen: '" Instruktoren ": [" Joe Black "," Will Smith "," Some Other "]]. Wenn Sie mehr Informationen über die Instruktoren speichern möchten, erstellen Sie einfach eine neue Sammlung "Instruktoren" und tragen Sie den Namen ID. '{" _id ":" Joe Black "," Alter ": 21," Telefon ":" 123 "}'. Versuchen Sie, an Einfachheit zu denken und wie Ihre Daten abgefragt werden, bevor Sie über Relational nachdenken. NoSQL (NoRelational) ist schwer zu verstehen, aber es zahlt sich aus, wenn Sie es tun. – AntonioOtero