【发布时间】:2017-03-31 16:49:04
【问题描述】:
我最近开始在 Node.js 应用程序中将 Mongoose 与 Express.js 一起使用,我有一个关于设计架构的正确方法的问题。
我有几个模式有一些关系,即 Location 模式有一个对象数组(在这个上下文中它不是 JS 对象),并且 Object 模式有它的 Location 属性。我了解到 Mongoose 中的关系是使用人口来解决的,但是当我实现这种方法时,我注意到我必须输入很多重复的代码,即每当我想创建一个新对象时,我还必须更新 Location 的数组对象,然后将位置分配给对象的属性。仅手动组装所有具有 locationId 属性的对象,该属性等于我想在单独的查询中从数据库中获取的位置,这不是更简单吗?
我也考虑过将对象存储在位置文档中的数组中(作为子文档),但我决定我希望能够与位置分开使用对象(创建、删除、更新)(不查询位置)所以我猜这种方法不符合我的需求。但是在我的情况下,人口也有其缺点,所以我想最好是手动收集特定位置的对象,通过该位置的 id 在单独的查询中。
我想听听该技术的一些专业或高级用户对设计 Mongoose 模式的意见,这样我和其他人就不会在以后维护和扩展我们的应用程序时遇到麻烦。
以下是我目前有问题的架构:
var locationSchema = new mongoose.Schema({
title: String,
objects: [{ type: String, ref: 'object' }]
});
var objectSchema = new mongoose.Schema({
title: String,
location: { type: String, ref: 'location' }
});
【问题讨论】:
-
你能质疑你拥有的所有模式吗?
-
我刚刚做到了。 :)
-
对于那些感兴趣的人,我刚刚尝试将
mongoose-autopopulate与我的两个模式一起使用,结果出现内存不足错误。我相信这是由于循环引用而发生的:我请求了一个具有一个对象的位置,因此该位置自动填充了该对象,然后该对象自动请求其位置,然后该位置再次请求其对象,此循环一直持续到OOM 错误。所以那些在你的模式中有一些循环引用的人(我相信这种情况经常发生)——不要尝试使用mongoose-autopopulate。 -
因为您正在架构中进行交叉关系,并且自动填充遍历循环引用并且内存不足(:
-
是的,我自己已经解释过了。 :)
标签: node.js mongodb relationships mongoose-schema mongoose-populate