首页 文章

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

提问于
浏览
0

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

幸运的是(?)有一个模块可以将补丁DBRef支持变为mongoose:https://github.com/goulash1971/mongoose-dbref

不幸的是,我可以' method to dereference, but it takes a single dbref); '获取' method to dereference, but it takes a single dbref); '填充' doesn'似乎要修补以填充DBRef,我可以't tell how I' m应该分配一个DBRef给定源文件[collection.items.push(?????)] .

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

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

1 回答

  • 0

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

    在MongoDB服务器内部,这些服务没有用处,只是文档中的数据 . 关键是在一些驱动程序和ODM实现中使用,以允许通过向服务器发出附加查询来进行某种自动扩展,以使其他地方的数据看起来像是引用文档的普通子文档部分 . 这可以是自动的或延迟加载,具体取决于实现,但始终通过线路完成并在客户端进行处理 . 服务器无法遍历或加入此数据 .

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

    在Mongoose的情况下,为了方便起见,有内置的函数来为你做这种加载,虽然不是严格的DBRef并且在同一集合中使用具有不同模式的文档与将文档存储在外部的方法相同引用文档 .

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

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

相关问题