使用 Mongoose / mongoose-dbref 使用和填充(真实的)DBRef 数组

Posted

技术标签:

【中文标题】使用 Mongoose / mongoose-dbref 使用和填充(真实的)DBRef 数组【英文标题】:Using and populating (real) DBRef arrays with Mongoose / mongoose-dbref 【发布时间】:2014-02-24 17:47:56 【问题描述】:

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

幸运的是(?)有一个模块可以将 DBRef 支持猴子修补到猫鼬中:https://github.com/goulash1971/mongoose-dbref

不幸的是,我无法理解这些文件。我能说的最好的就是无法在数组中使用 DBRefs(有一个“获取”方法可以取消引用,但它需要一个 dbref); 'populate' 似乎没有被修补以填充 DBRefs,而且我不知道我应该如何分配给定源文档 [collection.items.push(?? ???)]。

从互联网上,我似乎可以分配一个形式为 $id: document._id, $ref: 'Collection' 的对象——在记录结果时,它似乎已“采用”为 DBRef数据类型,但我不确定这是否正确,因为我似乎无法用它做任何有用的事情(将 ref 转回文档)。

我真正想要的是一种表示多个集合中项目的有序列表的方法;我对此的任何解决方案都很好,但到目前为止 DBRefs 是我所拥有的最好的。帮忙?

【问题讨论】:

DBRefs 在 Mongoose 中没有用。它们没有增加任何价值,因为它们只是有关与它们关联的标识符的元数据。 MongoDB 没有以任何有意义的方式使用它们。 如果可能,您可能需要考虑将数据拆分为多个数组并依赖ref,这样您就可以使用populate 我确实考虑过,但这让订购变得困难。本质上,我有需要存储的内容块。有些块的结构与其他块不同,因此它们有自己的模式。我发现你可以在 Mongoose 的一个集合中拥有多个模型,但我不能将集合用作参考,只有一个模型:( 你为什么选择 MongoDb? 这是我使用的基本系统。与其弄清楚如何使用它,不如把它撕掉。 【参考方案1】:

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

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

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

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

重要的是要考虑您的应用程序的数据访问模式,而不是简单地选择您习惯的那种关系设计。请记住,您一次只能从一个集合中读取,最好通过一次读取或写入来获取您需要的数据,而不需要通过网络进行多次操作,这会大大减慢速度。

简而言之,您应该始终考虑首先嵌入子文档,然后仅在绝对必要时才使用您最支持的任何形式的外部引用。您的应用程序用户最终会感谢您。

【讨论】:

自从我发布这个问题以来,我已经在这个问题上取得了进展,但我感谢您对 DBRefs 实际上是什么的清晰解释。你假设我没有意识到他们在 Mongo 的末端没有什么特别之处是正确的。我的第一个工作实现或多或少地做了你在这里所说的:利用事物的无模式特性。它并没有解决我所有的问题,但我从 IRC 上的一位好心人那里得到了更多帮助,所以在这之间,我准备好了:) 那么,您将整个用户文档作为子文档嵌入到所有用户数据中吗?当用户更改某些内容时?您必须编写自己的更新脚本来替换所有用户子文档并拥有大量冗余数据?我不知道任何我想要的用例。

以上是关于使用 Mongoose / mongoose-dbref 使用和填充(真实的)DBRef 数组的主要内容,如果未能解决你的问题,请参考以下文章

使用 Mongoose / mongoose-dbref 使用和填充(真实的)DBRef 数组

NestJS 和 Mongoose 使用 Mongoose-Sequence

使用 mongoose.createConnection() 与 mongoose.connect() 时查询挂起

使用 mongoose.createConnection() 与 mongoose.connect() 时查询挂起

Egg中使用egg-mongoose和常用的Mongoose 方法

Egg中使用egg-mongoose和常用的Mongoose 方法