我有一个名为Org
的集合,其中包含资源(Resources
架构),这些资源在团队之间共享(Teams
架构)
{
"_id": ObjectId("511cfbc9d593e5290c000005"),
"name": "Some org name",
"resources": [
{
"_id": ObjectId("511cfbc9d593e5290c000007"),
"name": "Printer1",
/* mongoose.Schema.Types.Mixed */
"details": {
"ip": "192.168.1.99"
}
}, {
"_id": ObjectId("511cfbc9d593e5290c000008")
"name": "Fax1",
"details": {
"number": "XXXXXXXXXXXX"
}
}
],
"teams" : [
{
"_id": ObjectId("511cfbc9d593e5290c000012"),
"name": "sales",
/*"resources": {type: [mongoose.Schema.Types.ObjectId], ref: 'Resources'}*/
"resources": [ObjectId("511cfbc9d593e5290c000007")]
}, {
"_id": ObjectId("511cfbc9d593e5290c000006"),
"name": "developer",
"resources": [ObjectId("511cfbc9d593e5290c000007"), ObjectId("511cfbc9d593e5290c000008")]
}
]
}
还有一个People
集合,它是团队的一部分。
{
"name": "Peter",
"designation": "senior s/w engg.",
"contact": {}
/*"teams": {type: [mongoose.Schema.Types.ObjectId], ref: 'Teams'}*/
"teams": [ObjectId("511cfbc9d593e5290c000006")]
}
现在我想在资源或团队发生变化时跳过多次更新,所以我没有使用嵌套文档。我无法从ref
架构Resources
Teams
架构。因此,为了获得以下结果,我必须经历非常复杂的聚合功能。
{
"name": "Peter",
"designation": "senior s/w engg.",
"contact": {}
"teams": [{
"_id": ObjectId("511cfbc9d593e5290c000006"),
"name": "developer",
"resources": [{
"_id": ObjectId("511cfbc9d593e5290c000007"),
"name": "Printer1",
"details": {
"ip": "192.168.1.99"
}
}, {
"_id": ObjectId("511cfbc9d593e5290c000008")
"name": "Fax1",
"details": {
"number": "XXXXXXXXXXXX"
}
}]
}]
}
有人可以建议我是否在db设计中做错了。有没有更简单的方法?
答案 0 :(得分:3)
现在我想在资源或团队发生变化时跳过多次更新,所以我没有使用嵌套文档。
您会发现这是MongoDB架构设计中需要考虑的常见权衡。实际上,它将归结为您跳过多个更新的重要性。通常,多个更新并不像您想象的那样具有挑战性,并且最终会成为正确的决策,尤其是在需要阅读简单性和性能时。
有人可以建议我是否在db设计中做错了。有没有更简单的方法?
鉴于您声明的避免多次更新的意图,我不认为您的方法存在问题。就个人而言,在这种情况下,我会采用嵌套文档方法,并尝试解决多个更新。这将意味着更简单的查询,同时具有更好的性能(这通常是应用程序开发中最重要的考虑因素)。
答案 1 :(得分:0)
在猫鼬中,您可以简单地执行以下操作:
People.find({ name: "Peter" }).populate("teams").exec( callback );
如果这不会使teams.resources
填充(我怀疑,因为猫鼬非常灵活),请尝试这样做:
People.find({ name: "Peter" })
.populate("teams")
.populate("teams.resources")
.exec( callback );
此外,请不要忘记在ref
架构的teams
属性中添加People
。