如何在Mongoose中使用动态父引用$graphLookup



假设我正在制作一个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根据jarfood_itemparent.type字段动态更改from集合?

在Mongo中没有很好的方法可以做到这一点。相反,我选择实现一个";祖先阵列";不必进行回归查询的模型。

https://www.mongodb.com/docs/manual/tutorial/model-tree-structures-with-ancestors-array/

相反,每次创建新对象时,该对象都会简单地将自己附加到其父对象的祖先数组的副本中,并通过n + 1扩展其祖先数组。每次创建另一个子项时,此过程都会重复;不需要进行回归查询,因为存储了先前的树位置。

请注意,这使得移动树项目变得非常困难

如果你需要移动东西,你必须:

  1. 实现一种算法来更新父母的位置及其所有子女的祖先数组(成本高昂(
  2. 制作一个单独的集合,其中每个文档引用foodjarfridge,并在那里使用graphLookup,因为所有内容都在同一个集合中

最新更新