在以下博客中,有一个示例:
http://blog.mongodb.org/post/87200945828/6-rules-of-thumb-for-mongodb-schema-design-part-1
产品可能包含许多零件
db.parts.findOne()
{
_id : ObjectID('AAAA'),
partno : '123-aff-456',
name : '#4 grommet',
qty: 94,
cost: 0.94,
price: 3.99
}
db.products.findOne()
{
name : 'left-handed smoke shifter',
manufacturer : 'Acme Corp',
catalog_number: 1234,
parts : [ // array of references to Part documents
ObjectID('AAAA'), // reference to the #4 grommet above
ObjectID('F17C'), // reference to a different Part
ObjectID('D2AA'),
// etc
]
我正在考虑做类似的事情,除了产品可能由许多产品组成(即它们将具有相同的架构)。产品的环境影响将是儿童产品对环境影响的总和。这些孩子可以将自己的父母产品作为其他儿童产品,如树。
为了使更新设计不那么复杂,如果儿童的环境影响发生了变化,它就不会自动将变更传播到链中。父母可以从子女的更新时间戳中看到它更新,并且可以选择通过网络界面重新计算更新其字段。
我是MongoDB的新手,所以只想让社区运行这种架构设计,看看是否有任何潜在的陷阱需要注意这种方法。谢谢。
答案 0 :(得分:1)
通过上述设计,儿童的环境影响不会存储在儿童阵列中。因此,要获得产品的整体环境影响,您必须运行两个查询,这可能没问题。如果最好在一个查询中获得该结果,那么您必须将每个子项的环境影响存储在该数组中。
你提到孩子们可以有自己的孩子。所以你进入树形结构。请查看此页面以获取可能的解决方案:
https://docs.mongodb.com/manual/applications/data-models-tree-structures/
我的解决方案是“使用祖先阵列建模树结构”,这样您就可以在一个查询中获取所有后代及其相关的环境影响。这将涉及在
中仅保留_idparts : [{_id: 1}, {_id: 2}, ...]
然后跟踪祖先阵列中的父母和祖父母以及曾祖父母等:
ancestors: [{_id: 3}, {_id: 2}, {_id: 1}, ...]
请参阅链接以获得有关此模式的清晰说明。