Node.js 使用Mongoose/Mongoose DBRef并填充(真实)DBRef数组

Node.js 使用Mongoose/Mongoose DBRef并填充(真实)DBRef数组,node.js,mongodb,mongoose,schema,data-modeling,Node.js,Mongodb,Mongoose,Schema,Data Modeling,Mongoose似乎不支持Mongo数据库引用。显然,他们发布了“DBRef”支持,但实际上只是简单的引用(无法引用来自不同集合的文档)。我终于成功地创建了一个模式,它允许我保存一个ObjectID引用数组并填充它们,这对于模式的某些部分来说是非常好的,但是如果我可以使用适当的DBREF创建一个数组,让我引用多个集合中的文档,那将非常方便 幸运的是(?)有一个模块可以在mongoose中使用monkey补丁DBRef支持: 不幸的是,我无法理解这些文件。我能说的最好的情况是没有能力在数组中使用d

Mongoose似乎不支持Mongo数据库引用。显然,他们发布了“DBRef”支持,但实际上只是简单的引用(无法引用来自不同集合的文档)。我终于成功地创建了一个模式,它允许我保存一个ObjectID引用数组并填充它们,这对于模式的某些部分来说是非常好的,但是如果我可以使用适当的DBREF创建一个数组,让我引用多个集合中的文档,那将非常方便

幸运的是(?)有一个模块可以在mongoose中使用monkey补丁DBRef支持:

不幸的是,我无法理解这些文件。我能说的最好的情况是没有能力在数组中使用dbref(有一个“fetch”方法去引用,但它需要一个dbref);'“填充”似乎没有进行修补以填充DBRef,并且我无法告诉如何在给定源文档[collection.items.push(???))的情况下分配DBRef

从internet上看,我似乎可以指定一个形式为{$id:document.\u id,$ref:'Collection'}的对象——在记录结果时,它似乎“take”为DBRef数据类型,但我不确定这是否正确,因为我似乎无法对它做任何有用的事情(将ref转换回文档)

我真正想要的是一种表示来自多个集合的有序项目列表的方法;我认为任何解决方案都可以,但到目前为止,dbref是我得到的最好的解决方案。帮助?

DBRef()是一个元组,包含ObjectId、集合名称,可能还包含另一个集合中引用对象的数据库容器名称

在MongoDB服务器内部,这些数据没有任何用途,只是文档中的数据。要点是在一些驱动程序和ODM实现中使用,通过向服务器发出额外的查询来允许某种类型的自动扩展,以便使其他地方的数据看起来是引用文档的普通子文档部分。这可以是自动加载,也可以是延迟加载,具体取决于实现,但始终通过连接完成,并在客户端进行处理。服务器不会遍历或加入此数据

此外,MongoDB集合是无模式的,因此没有关系意义上的集合中的所有文档都必须具有相同的结构

在Mongoose的情况下,为了方便起见,有内置函数为您执行此类加载,虽然严格来说不是DBRef,但在同一集合中使用具有不同模式的文档与在引用文档外部存储文档的方法相同

重要的是考虑应用程序的数据访问模式,而不是简单地选择与您习惯的相同类型的关系设计。请记住,您一次只能从一个集合中读取数据,最理想的做法是在一次读取或写入中获取所需的数据,而无需通过线路进行多次操作,这将大大降低速度


简而言之,你应该总是考虑先嵌入子文档,然后只在绝对需要的时候使用外部引用,这是你最好支持的形式。您的应用程序用户最终会感谢您。

dbref在Mongoose中没有用处。它们没有增加任何价值,因为它们只是与它们相关联的标识符的元数据。MunGDB不以任何有意义的方式使用它们。如果可能的话,您可能需要考虑将数据分割成多个数组,并且依赖于<代码> REF 。因此,您可以使用<代码>填充> <代码>。基本上,我有需要存储的内容块。其中一些块的结构与其他块不同,因此它们有自己的模式。我发现在Mongoose中,一个集合中可以有多个模型,但我不能将集合用作参考,只能使用模型:(你为什么选择MongoDb?这是我使用的基本系统。把它拆掉比弄清楚如何使用它要困难得多。自从我发表文章以来,我在这个问题上取得了进展,但我感谢你对DBREF实际是什么的清晰解释。你的假设是正确的,我没有意识到它们在Mongo方面没有什么特别之处。我的第一个工作实现或多或少像你在这里说的那样:利用事物的无模式性。它并不能解决我所有的问题,但我从IRC的一位好心人那里得到了更多的帮助,所以在这两者之间,我已经准备好了:)