假设我正在制作一个react应用程序来管理餐厅冰箱里的东西。我有三个收藏:
- 冰箱(包含罐子或食品(
- 罐子(包含罐子或食物;存在于冰箱或其他罐子中(
- 食品(存在于罐子或冰箱中(
冰箱:
[{
"name": "abc",
"temp": 23,
}, ...]
罐子:
[{
"name": "jar1",
"parent":
{
"type": "jar",
"id": "id_of_parent_jar"
}
}, {
"name": "jar2",
"parent":
{
"type": "refrigerator",
"id": "id_of_parent_refrigerator"
}
},
...]
食品:
[{
"name": "jar1",
"parent":
{
"type": "jar",
"id": "id_of_parent_jar"
}
},
...]
在我们使用所有三个集合的任何情况下都会出现问题:
food -> jar -> fridge
当jar父对象是冰箱时,无法告诉graphLookup更改from
字段。使事情进一步复杂化:
food -> jar -> jar -> fridge
引入了另一个问题;不能假设深度1
是一个罐子,深度2
是一个冰箱。深度1+n
理论上可以是任何数字,直到我们达到refrigerator
参考为止。
如何让graphLookup
根据jar
或food_item
的parent.type
字段动态更改from
集合?
在Mongo中没有很好的方法可以做到这一点。相反,我选择实现一个";祖先阵列";不必进行回归查询的模型。
https://www.mongodb.com/docs/manual/tutorial/model-tree-structures-with-ancestors-array/
相反,每次创建新对象时,该对象都会简单地将自己附加到其父对象的祖先数组的副本中,并通过n + 1
扩展其祖先数组。每次创建另一个子项时,此过程都会重复;不需要进行回归查询,因为存储了先前的树位置。
请注意,这使得移动树项目变得非常困难
如果你需要移动东西,你必须:
- 实现一种算法来更新父母的位置及其所有子女的祖先数组(成本高昂(
- 制作一个单独的集合,其中每个文档引用
food
、jar
或fridge
,并在那里使用graphLookup
,因为所有内容都在同一个集合中