的
注意:我在发布此帖后不久就回答了我自己的问题。如果您花时间阅读我冗长的帖子,感谢和抱歉。
我是一个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再次显示。
答案 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#