这是我的猫鼬架构:
var SchemaA = new Schema({
field1: String,
.......
fieldB : { type: Schema.Types.ObjectId, ref: 'SchemaB' }
});
var SchemaB = new Schema({
field1: String,
.......
fieldC : { type: Schema.Types.ObjectId, ref: 'SchemaC' }
});
var SchemaC = new Schema({
field1: String,
.......
.......
.......
});
当我使用查找查询访问 schemaA 时,我想要拥有字段/属性
SchemaA 以及 SchemaB 和 SchemaC 的方式与我们在 SQL 数据库中应用联接操作相同。
这是我的方法:
SchemaA.find({})
.populate('fieldB')
.exec(function (err, result){
SchemaB.populate(result.fieldC,{path:'fieldB'},function(err, result){
.............................
});
});
上面的代码可以完美运行,但问题是:
- 我想通过 SchemaA 获取 SchemaC 的信息/属性/字段,并且不想填充 SchemaB 的字段/属性。
- 不想获取 SchemaB 的属性的原因是,额外的人口会不必要地减慢查询速度。
长话短说:
我想通过 Schema 填充 Schema,而不填充 Schema。
您能建议任何方式/方法吗?
作为狂热的 mongodb 粉丝,我建议您使用关系数据库来存储高度相关的数据 - 这就是它的构建目的。当您必须执行 3 个以上查询才能获取单个对象时,您将失去 mongodb 的所有优势。
Buuuuuut,我知道这个评论会被置若罔闻。最好的选择是尽可能关注绩效。第一步是将字段限制为所需的最低限度。即使对于基本查询和any数据库引擎-只获取你需要的字段 (eg. SELECT * FROM
=== 不好...别再这样做了!)。您还可以尝试进行精益查询,以帮助节省 mongoose 对数据所做的大量后处理工作。我没有测试过这个,但它应该有效......
SchemaA.find({}, 'field1 fieldB', { lean: true })
.populate({
name: 'fieldB',
select: 'fieldC',
options: { lean: true }
}).exec(function (err, result) {
// not sure how you are populating "result" in your example, as it should be an array,
// but you said your code works... so I'll let you figure out what goes here.
});
另外,一种非常“mongo”的方法就是将 SchemaC 中的引用保存回 SchemaA。当我说“mongo”方式时,您必须摆脱多年来对关系数据查询的思考。尽一切努力减少对数据库执行的查询,即使需要双向引用和/或数据复制。
例如,如果我有一个 Book 模式和 Author 模式,我可能会在 Books 集合中保存作者的名字和姓氏,以及对 Authors 集合中完整个人资料的 _id 引用。这样我就可以在单个查询中加载我的图书,仍然显示作者的姓名,然后生成指向作者个人资料的超链接:/author/{_id}
。这被称为“数据非规范化”,众所周知它会让人胃痛。我尝试将其用于不经常更改的数据(例如人名)。在名称确实发生更改的情况下,编写一个函数来更新多个位置的所有名称是很简单的。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)