Mongoose:如何在不填充第一层字段的情况下填充 2 层深层人口?在 mongodb 中

2024-07-01

这是我的猫鼬架构:

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 的属性的原因是,额外的人口会不必要地减慢查询速度。

长话短说: 我想通过 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(使用前将#替换为@)

Mongoose:如何在不填充第一层字段的情况下填充 2 层深层人口?在 mongodb 中 的相关文章

随机推荐

  • D3 获取 .data() 中的前一个元素

    如何获取传递给的数据集前一个元素的值 data in d3 我知道在回调中我不能做类似的事情 function d i console log d i 例如 将数据元素及其索引打印到控制台 但是我如何引用前一个元素呢 Like d i 1
  • 问题:activerecord (rails3),将范围与包含链接起来

    在 Rails3 中 链接两个范围 ActiveRelations 时似乎存在问题 每个范围都有不同的包含 考虑这两个范围 它们各自都能正常工作 第一范围 scope global only lambda user includes cou
  • 使用 setState() 将对象添加到对象数组中

    我的组件的状态是一个对象数组 this state userFavorites id 1 title A id 2 title B 每次单击按钮时 我都需要使用另一个对象更新我的状态 就像上面状态中的对象一样 例如 id 3 标题 C 如果
  • 无锁多线程编程会让事情变得更容易吗?

    我只读了一点关于这个主题的内容 但似乎唯一的好处是解决争用问题 但它不会对死锁问题产生任何重要影响 因为无锁的代码是如此之小和基本 fifos lifos hash 从来没有出现过死锁问题 所以一切都与性能有关 这是正确的吗 无锁编程 据我
  • ggplot2 中的迷你图

    Tufte Sparklines 如他的美丽的证据 已被复制到基础图形作为 的一部分耶鲁工具包 https cran r project org web packages YaleToolkit index html并由此得到进一步完善这个
  • 这段C代码的作用是什么?

    尽管我已经完成了大量其他类型的编程 但我对 C 编程确实很陌生 我想知道是否有人可以向我解释为什么这个程序输出 10 include
  • flutter 忽略标头 X-Firebase-Locale 因为它的值为 null

    我将我的应用程序与 firebase 链接 但是当我尝试在应用程序中使用新用户注册时 我收到此错误 忽略标头 X Firebase Locale 因为它的值为 null 这是身份验证屏幕代码 class Authscreen extends
  • 如何为符号设置值

    我想将值设置为变量列表 如下所示 list 1 2 and if list 1 is a then a现在将等于二 我怎样才能实现这个目标 好吧 让我们天真地尝试一下 做一个列表 In 1 ClearAll list a b c list
  • 每笔交易后余额计算

    我有这样的表 cust id acc no trans id trans type amount 1111 1001 10 credit 2000 0 1111 1001 11 credit 1000 0 1111 1001 12 debi
  • Python 中是否有通用列表的类似“join”的函数?

    在Python中 字符串列表可以通过以下方式连接在一起 join ab c def 但是我怎样才能轻松地加入数字列表或其他一些东西呢 像这样 0 join 1 2 3 gt 1 0 2 0 3 现在我必须这样做 sum x 0 for x
  • 从 HashMap 检索值的顺序是插入顺序

    我正在尝试找出 HashMap 中的值的检索顺序 这是相同的代码片段 import java util HashMap public class HashMapExample public static void main String a
  • 使用 Oauth 2 来自 Azure AD 的“不支持访问授予授权代码”

    我正处于一个授权码授予流程 http msdn microsoft com en us library azure dn645542 aspx使用 Azure AD 尽管文档说grant type应该authorization code 我
  • ASP.NET OWIN OpenID Connect 不创建用户身份验证

    我有一个 ASP NET 4 6 Web 应用程序 我正在尝试使用 OWIN 添加 OpenId Connect 我添加了 Owin 启动类 所有内容似乎都配置正确 但我遇到的问题是 ASP 身份 经过身份验证的用户永远不会创建 我最终陷入
  • 如何创建解决方案级NuGet包?

    如何创建解决方案级 NuGet 包 也就是说 它不涉及任何项目 并列在 nuget packages config 中 不在任何项目级的 packages config 文件中 例如 psake 和 RavenDB Server 是解决方案
  • 在一台计算机上的一个 Git 中切换用户身份[重复]

    这个问题在这里已经有答案了 I have ONE存储库于GitHub 我们称之为Repo 1 我想首先访问该存储库默认 Git 用户 让我们调用该用户User 1 我创建SSH 密钥对 一切都很好 效果很好 I made ANOTHER存储
  • 使用 Strope 库传输 XMPP 文件

    谁能告诉我使用 strope 在 XMPP 中实现文件传输 图书馆 我建议使用XEP 0065 SOCKS5 字节流 http xmpp org extensions xep 0065 html恐怕你需要自己编码
  • 在动画期间更改 jQuery 的动画持续时间

    是否可以更改duration当前正在运行的两个不同值之间的 jQuery 动画 我尝试过改变duration通过直接赋值 但没有成功 var timing duration 4000 document click function e ti
  • 我们应该如何编写 get 方法,以便私有字段不会逃脱其预期范围? [复制]

    这个问题在这里已经有答案了 来自 Java 并发实践 发布一个对象可能会间接发布其他对象 如果您添加一个 已发布的knownSecrets 集的秘密 您还发布了 秘密 因为任何代码都可以迭代 Set 并获取对的引用 新的秘密 类似地 从非私
  • 文档片段如何工作?

    谁能简要解释一下 documentFragment 的实际用途吗 我一直在寻找明确的解释 但直到现在我还没有得到任何解释 我读到的是 documentFragment 是类似于 DOM 的结构 我们可以在其中添加修改 DOM 元素 而不会中
  • Mongoose:如何在不填充第一层字段的情况下填充 2 层深层人口?在 mongodb 中

    这是我的猫鼬架构 var SchemaA new Schema field1 String fieldB type Schema Types ObjectId ref SchemaB var SchemaB new Schema field