2013-06-25 27 views
9

Mam dokument "właściciel", który może mieć "n" liczba obozów i obozów mają "instruktorzy" a instruktorzy mają "klasy". Wcześniej próbowałem tego dokonać za pomocą zagnieżdżonych tablic (patrz link do mojego wpisu poniżej), jednak nauczyłem się, że operator pozycyjny "$" nie zagnieździ się tak głęboko. MongoDB: Adding an array into an existing arrayMongoDb: Jak wstawić dodatkowy obiekt do kolekcji obiektów?

Jednak dowiedziałem się, że obejście tego problemu polegałoby na użyciu kolekcji obiektów zamiast tablic. Zakładam, że muszę użyć "update" z "$ set", aby dodać dodatkowe "obozy", jednak za każdym razem, gdy robię wszystko, to zastępuję (aktualizuję) poprzedni obóz, który został wstawiony.

Poniżej jest hierarchiczna struktura usiłuję osiągnąć:

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

    } 

} 

Mam również próbuje następujące:

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

ale to generuje identyfikator {nieoczekiwany błąd.

Każda pomoc z przykładowymi komendami mongo, aby osiągnąć powyższą strukturę, byłaby najbardziej doceniana.

V/R

Chris

+1

To nie są ważne dokumenty. Nie możesz mieć nienazwanych obiektów zagnieżdżonych, jak próbujesz zrobić z "obozami" i "instruktorami". – JohnnyHK

+1

miałeś na myśli 'obozy: {nazwa: 'cubs-killeen'}' zamiast 'camps: {{name: 'cubs-killeen'}}'? –

+0

@Relfor, tak, o to mi chodziło! dzięki za wytłumaczenie. Teraz, jak osiągnąć tę strukturę dokumentu? – cpeele00

Odpowiedz

18

Jako inny wspomniano, Struktura chcesz nie jest ważna. polecam następującą strukturę dokumentu Właściciel:

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

a następnie

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

Mając to można dodać obozy tak:

Nadzieję, że to pomaga.

+0

hmmm, jak zatem mógłbym skojarzyć instruktora z obozem? A potem zajęcia z Instruktorem (skoro różni instruktorzy uczą różnych klas)? Takie podejście wydaje się być sposobem na korzyści płynące z bogatego dokumentu Mongo. Może powinienem po prostu użyć Mongoose i zaprojektować to w relacyjny sposób. Dzięki za odpowiedź :-) – cpeele00

+2

A więc, obóz może mieć kilku instruktorów? W takim przypadku po prostu umieść listę "instruktorów" w każdym obozie w "obozach". Możesz stworzyć szereg ciągów dla takiej prostoty: '" instruktorzy ": [" Joe Black "," Will Smith "," Some Other "]'. Jeśli chcesz zapisać więcej informacji na temat instruktorów, po prostu utwórz nową kolekcję "instruktorzy" i podaj jej nazwę. '{" _id ":" Joe Black "," age ": 21," phone ":" 123 "}'. Spróbuj zastanowić się nad prostotą i sposobem, w jaki twoje dane będą sprawdzane, zanim zaczniesz rozważać myślenie w trybie relacyjnym. NoSQL (NoRelational) jest trudny do uchwycenia w umyśle, ale opłaca się, gdy to zrobisz. – AntonioOtero

Powiązane problemy