Mongoose似乎不支持Mongo DBRefs。显然他们发布了“DBRef”支持,但它实际上只是简单的引用(无法引用来自不同集合的文档)。我终于设法创建了一个模式,允许我保存一个ObjectID引用数组并填充它们,这对我的模式的某些部分很有用,但是如果我可以使用适当的DBRefs来创建一个数组,这将非常方便让我参考一些馆藏中的文件。
幸运的是(?)有一个模块可以将补丁DBRef支持变为mongoose:https://github.com/goulash1971/mongoose-dbref
不幸的是,我无法理解这些文件。我能说的最好的是没有能力在数组中使用DBRef(有一个'fetch'方法来取消引用,但它需要一个dbref); 'populate'似乎没有修补填写DBRef,我不知道我应该如何分配给出一个源文件的DBRef [collection.items.push(?? ???)]。
从互联网上看,似乎我可以分配{$ id:document._id,$ ref:'Collection'}形式的对象 - 在记录结果时,它似乎已被“采取”为DBRef数据类型,但我不确定这是否正确,因为我似乎无法做任何有用的事情(将ref转回文档)。
我真正想要的是一种表示来自多个集合的有序项目列表的方法;任何解决方案对我来说都很好,但到目前为止,DBRefs是我得到的最好的。帮助
答案 0 :(得分:0)
DBRef(as explained in detail here)是一个元组,包含ObjectId,集合名称,以及可能是另一个集合中引用对象的数据库容器名称。
在MongoDB服务器内部,这些服务没有用处,只是文档中的数据。关键是在一些驱动程序和ODM实现中使用,以允许通过向服务器发出附加查询来进行某种自动扩展,以使其他地方的数据看起来像是引用文档的普通子文档部分。这可以是自动的或延迟加载,具体取决于实现,但始终通过线路完成并在客户端进行处理。服务器无法遍历或加入此数据。
此外,MongoDB集合是无模式的,因此在关系意义上没有任何内容表明集合中的所有文档都必须具有相同的结构。
在Mongoose的情况下,为方便起见,有内置的函数为你做这种加载,虽然不严格的DBRef并且在同一个集合中使用具有不同模式的文档与存储引用文档外部的文档。
考虑应用程序的数据访问模式非常重要,而不是简单地选择您习惯的相同类型的关系设计。请记住,您一次只能从一个集合中读取数据,最理想的是在单次读取或写入时获取所需的数据,而无需通过线路进行多次操作,这将大大减慢速度。
简而言之,您应该始终考虑首先嵌入子文档,然后仅在必要时使用外部引用任何最佳支持的表单。您的应用程序用户最终会感谢您。