2013-06-25 7 views
9

У меня есть документ «владелец», в котором «n» количество лагерей и лагерей имеет «инструкторов», а у инструкторов есть «классы». Раньше я пытался выполнить это с помощью вложенных массивов (см. Ссылку на мой пост ниже), однако я узнал, что позиционный оператор «$» не так глубоко вложен. MongoDB: Adding an array into an existing arrayMongoDb: Как вставить дополнительный объект в коллекцию объектов?

Однако я узнал, что обходным решением будет использование коллекций объектов вместо массивов. Я предполагаю, что я должен использовать «обновление» с «$ set», чтобы добавить дополнительные «лагеря», однако каждый раз, когда я делаю все, что он делает, это перезаписывать (обновлять) предыдущий лагерь, который был вставлен.

Ниже иерархическая структура Я пытаюсь выполнить:

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

    } 

} 

Я также пытался следующее:

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

, но это бросает неожиданный идентификатор {ошибку.

Любая помощь с некоторыми примерами команд манго для достижения вышеуказанной структуры была бы наиболее оценена.

V/R

Крис

+1

Это недопустимые документы. Вы не можете иметь неназванные вложенные объекты, как вы пытаетесь сделать с «лагерями» и «инструкторами». – JohnnyHK

+1

Вы имели в виду 'camps: {name: 'cubs-killeen'}' вместо 'camps: {{name: 'cubs-killeen'}}'? –

+0

@ Рельфор, да, вот что я имел в виду! Спасибо за разъяснения. Теперь, как достичь этой структуры документа? – cpeele00

ответ

18

Как другой упоминалось, структура вы хотите не является действительным. я рекомендую следующую структуру для владельца документа:

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

, а затем

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

Имея это, вы можете добавить лагери, как это:

Надеется, что это помогает.

+0

Хммм, как тогда я связал бы инструктора с лагерем? А затем занятия с инструктором (поскольку разные преподаватели учат разные классы)? Этот подход, похоже, уходит от преимуществ Rich Document от Mongo. Может быть, я должен просто использовать Mongoose и спроектировать это реляционным способом. Спасибо за ответ :-) – cpeele00

+2

Итак, в лагере могут быть несколько инструкторов? В этом случае просто поставьте список инструкторов внутри каждого лагеря в «лагерях». Вы можете сделать его массивом строк для простоты следующим образом: «Инструкторы»: [«Joe Black», «Will Smith», «Some Other»] '. Если вы хотите сохранить больше информации о инструкторах, просто создайте новую коллекцию «инструкторы» и укажите ее имя. '{" _id ":" Joe Black "," age ": 21," phone ":" 123 "}'. Подумайте о простоте и о том, как ваши данные будут запрашиваться, прежде чем рассматривать мышление о Relational. NoSQL (NoRelational) трудно поймать в уме, но он окупается, когда вы это делаете. – AntonioOtero

Смежные вопросы