【问题标题】:Mongoose populate vs aggregate猫鼬填充与聚合
【发布时间】:2019-08-29 17:50:18
【问题描述】:

我注意到 mongoose 4.7.3 中的 .populate 函数在每次查找时在数据库上运行单独的查询:

  db.House
    .populate('ownerId')
    .exec((err, result) => {
    ..

使用聚合管道,我们可以通过单个查询查找多个集合:

    db.House.aggregate([
    {
      $lookup:
      {
        from: 'owners',
        localField: 'ownerId',
        foreignField: '_id',
        as: 'owner',
      },

mongoose 使用 .populate 进行单独查询的原因是什么?聚合函数在查找时性能更高吗?

【问题讨论】:

  • Mongoose 中的 populate() 功能是一种客户端查询聚合功能,早于 MongoDB 3.2 中添加服务器端 $lookup 支持。

标签: node.js mongodb mongoose


【解决方案1】:

以下是差异摘要:

$lookup

  • 只能与aggregate一起使用
  • 只能用于从unsharded collections拉取参考文档
  • 可以按任何字段拉入参考文档
  • 通常性能更高,因为它是服务器端操作
  • 需要 MongoDB 3.2+

猫鼬populate()

  • 可以与findaggregate一起使用
  • 可用于从分片和非分片集合中提取参考文档
  • 只能拉入_id引用的文档
  • 无 MongoDB 版本要求

【讨论】:

  • 我想知道...我读错了mongoddb manual 吗?我发现聚合的信息也适用于分片数据库。
  • @AdrianMoisa aggregate 可以,但$lookup 不行。我为此添加了一个文档链接。
  • 感谢您的澄清。刚刚发现这个有趣的answer。和你说的一样。
  • 我不能用 _id 以外的东西 .populate() 吗?我认为您可以通过提供 localField 和 foreignField(参考模型)和 .populate() 在您的架构上设置一个虚拟。我想我从未尝试过,但我想我可以将 localField 或 foreignField 设置为“_id”以外的其他内容?
猜你喜欢
  • 2015-12-23
  • 2017-01-23
  • 2016-12-19
  • 2015-09-15
  • 2018-01-30
  • 1970-01-01
  • 2015-07-13
  • 2016-10-10
相关资源
最近更新 更多