使用Mongo中的分层数据

时间:2010-09-24 23:35:03

标签: c# mongodb



注意:我在发布此帖后不久就回答了我自己的问题。如果您花时间阅读我冗长的帖子,感谢和抱歉。


简介



我是一个Mongo noob,只是试图把事情搞得一团糟。

我正在尝试创建一个分层数据结构,我可以动态添加节点/叶子。模式是固定的,但任何给定树上的节点都应该能够随时更改。我正在寻找的主要是如何在深层嵌套节点上添加/删除节点而不重写整个树。

这是一个静态分析程序的示例,该集合称为“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”

我也尝试在“assemblies.warnings”周围加上引号,但是说“无法使用字符串字段名称[警告]”附加到数组中

有没有人比我知道Mongo还能帮助我吗?

我试图在Mongo上做深层嵌套树是错误的吗?我是否会更好地使用多个集合并且有点关系?

我的印象是,不做关系(以及ACID)是Mongo的主要好处之一,但话又说回来,也许那只是我的noob再次显示。

1 个答案:

答案 0 :(得分:2)

所以我整天都在苦苦挣扎,果然,我把它发布到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#