当前位置: 首页 > 知识库问答 >
问题:

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

韩英锐
2023-03-14

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

幸运地(?)有一个模块可以在Mongoose中修补DBRef支持:https://github.com/goulash1971/mongoose-dbref

不幸的是,我看不懂这些文件。我所能告诉的最好的情况是,在数组中没有使用dbref的能力(有一个'fetch'方法来取消引用,但它需要单个dbref);'populate'似乎没有打补丁来填充DBRefs,而且我不知道在给定源文档[collection.items.push(?????)]的情况下应该如何分配DBRef。

从internet上看来,我可以分配一个形式为{$id:document._id,$ref:'collection'}的对象--当记录结果时,它似乎已经“取”为DBRef数据类型,但我不确定这是否正确,因为我似乎无法用它做任何有用的事情(将ref转换回文档)。

我真正想要的是一种表示来自多个集合的项的有序列表的方法;任何解决方案对我来说都是好的,但到目前为止,DBREF是我所拥有的最好的解决方案。救命?

共有1个答案

徐新荣
2023-03-14

DBRef(如这里详细解释的)是一个包含ObjectId、集合名称,可能还有另一个集合中引用对象的数据库容器名称的元组。

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

此外,MongoDB集合是无模式的,因此没有关系意义上的任何内容说明集合中的所有文档必须具有相同的结构。

在Mongoose的情况下,为了方便起见,内置了一些函数来为您进行这种加载,虽然不是严格意义上的DBRef,但在同一集合中使用不同模式的文档与将文档存储在引用文档的外部是相同的方法。

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

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

 类似资料:
  • 问题内容: 我使用Mongoose.js,无法解决3级层次结构文档的问题。 有2种方法可以做到。 首先 -没有裁判。 我需要出示C记录。仅知道_id的C,如何填充/找到它? 我曾尝试使用: 但是我不知道如何从returnet得到一个对象,我只需要c对象。 其次,如果使用裁判: 如何填充所有B,C记录以获取层次结构? 我试图使用这样的东西: 但是它将为single_c.title返回undefine

  • 我有两个收藏,一个是用户,另一个是猫。我想要猫的数据下我的用户集合。但我没有得到。 user.js

  • 好吧,我有以下几个Shemas: 我想要的是让用户跟踪品牌,按品牌名排序,所以对于这样做,我对FollowAction进行查询,找到用户所做的所有FollowAction,然后填充brand字段。 所以问题是我不能为品牌名的查询排序,我知道的唯一方法是返回所有文档并从nodejs应用程序中对它们进行排序。有人知道我怎么能那样做吗??或者我是否应该改变shema结构?? 我所做的查询是:

  • 我写代码时遇到了麻烦,这将允许以一种简单明了的方式获取用户和索赔细节。这是我的MongoDB结构, 我的实体类是: 索赔类别: 我有一种方法可以按名称获取用户,如下所示, 如果我尝试使用这个方法,会得到一个错误, 找不到能够从类型<code>org.bson.types转换的转换器。ObjectId以键入 所以我更改了我的用户实体类,如下所示, 而不是

  • 我的应用程序使用Spring Boot/JPA/MongoDB。 我使用以下方法将域类映射到MongoDB 但找不到如何使我的DBRef字段唯一。

  • 问题内容: 我在MongoDB中的规范化数据模型结构中遇到以下错误: 这是由于以下原因造成的: 具体的部分。我的文档中有一个DBRef对象,因此我可以引用另一个集合中的文档。嵌入式文档结构不是选项。那么我该如何解决呢? 问题答案: 您必须为其导入DBRef编解码器才能进行打印,如果您希望以文档json样式进行打印,则需要编写自己的DBRef编解码器,并将其添加到您给toJson()的编解码器中。