gpt4 book ai didi

node.js - Mongoose :如何在不填充第一级字段的情况下填充 2 级深度人口?在 mongodb 中

转载 作者:可可西里 更新时间:2023-11-01 09:57:03 25 4
gpt4 key购买 nike

这是我的 Mongoose 模式:

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){

.............................
});

});

上面的代码运行的很好,但是问题是:

  1. 我想通过 SchemaA 获得 SchemaC 的信息/属性/字段,我不想填充 SchemaB 的字段/属性。
  2. 不想获取 SchemaB 的属性的原因是,额外的填充会减慢不必要的查询。

长话短说:我想在不填充 SchemaB 的情况下通过 SchemaA 填充 SchemaC。

能否请您提出任何方式/方法?

最佳答案

作为狂热的 mongodb 粉丝,我建议您对高度相关的数据使用关系数据库 - 这就是它的构建目的。当您必须执行 3 个以上的查询来获取单个对象时,您将失去 mongodb 的所有优势。

Buuuuuut,我知道评论会被置若​​罔闻。最好的选择是尽可能注意性能。您的第一步是将字段限制为所需的最低限度。即使对于基本查询和任何数据库引擎,这也是一种很好的做法 - 只获取您需要的字段(例如。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}。这就是所谓的“数据反规范化”,众所周知它会让人胃灼热。我尝试将它用于不经常更改的数据——比如人名。在名称确实发生变化的情况下,编写一个函数来更新多个位置的所有名称是微不足道的。

关于node.js - Mongoose :如何在不填充第一级字段的情况下填充 2 级深度人口?在 mongodb 中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27168022/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com