Работа с иерархическими данными в Монго - PullRequest
3 голосов
/ 25 сентября 2010



Примечание: я закончил тем, что отвечал на свой вопрос вскоре после того, как опубликовал это.Спасибо и извините, если вы потратили время на чтение моего длинного поста.



Введение



Я своего рода моногий нуб, просто пытаюсь разобраться в этом.

Я пытаюсь создать иерархическую структуру данных, к которой я могу динамически добавлять узлы / листья.Схема является фиксированной, но узлы в любом данном дереве должны быть в состоянии изменить в любое время.Главное, что я ищу, это как добавить / удалить узлы на глубоко вложенных узлах без переписывания всего дерева.

Вот пример для программы статического анализа, коллекция называется "builds" .Разреженный документ будет выглядеть так (_id удален для краткости):

{ name: "build from changeset #5678", 
  assemblies: [
    { name: "someAssembly1.dll",
      warnings: [
        { level: 0,
          message: "something doesn't conform to our standard"
        }
      ] 
    }             
  ]
}



Итак, чтобы начать, я делаю следующее:

db.builds.insert({name: "build from changeset #5678})


Затем добавьте сборку:

db.builds.update({name: "build from changeset #5678"},
                 {$addToSet: {assemblies: {name: "someAssembly1.dll"}}})



РЕАЛЬНЫЙ вопрос

Теперь, как добавить предупреждение? Я думал, что это может быть что-то вроде этого:

db.builds.update({
  name: "build from changeset #5678",
  "assemblies.name": "someAssembly1.dll"
},{
 $addToSet: {
   assemblies.warnings: {
     level: 0,
     name: "something doesn't conform to our standard"
   }
 }
})

Но это дает мне "отсутствует: после id свойства (shell): 0"

Я также попытался поместить кавычки вокруг "assembly.warnings" , но там написано, что "нельзя добавить в массив, используя имя строкового поля [warnings]"


Кто-нибудь знает Монго лучше меня и может мне помочь?

Я ошибаюсь, пытаясь сделать глубоко вложенные деревья на Монго?Будет ли мне лучше делать это с несколькими коллекциями и несколько реляционными?

У меня сложилось впечатление, что НЕ выполнение реляционных (а также ACID) было одним из основных преимуществ для Mongo, но опять же, может быть, это просто мой нуб снова показывает.

1 Ответ

2 голосов
/ 25 сентября 2010

Так что я боролся с этим весь день, и, разумеется, в тот момент, когда я отправляю его в StackOverflow, я сталкиваюсь с чем-то, что дает мне ответ.Правильный ответ выглядит так:

db.builds.update({
  name: "build from changeset #5678",
  "assemblies.name": "someAssembly1.dll"
},{
 $addToSet: {
   "assemblies.$.warnings": {
     level: 0,
     name: "something doesn't conform to our standard"
   }
 }
})

Обратите внимание на

"assemblies.$.warnings"


Я нашел его здесь: http://groups.google.com/group/mongodb-user/browse_thread/thread/e8f4ea5dc1955a98#

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...