猫鼬填充与聚合

F.H*_*.H. 8 mongoose mongodb node.js

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

  db.House
    .populate('ownerId')
    .exec((err, result) => {
    ..
Run Code Online (Sandbox Code Playgroud)

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

    db.House.aggregate([
    {
      $lookup:
      {
        from: 'owners',
        localField: 'ownerId',
        foreignField: '_id',
        as: 'owner',
      },
Run Code Online (Sandbox Code Playgroud)

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

Joh*_*yHK 17

以下是差异的摘要:

$lookup

  • 只能与 aggregate
  • 只能用于从未分片的集合中拉入引用文档
  • 可以按任何字段拉入参考文档
  • 通常性能更高,因为它是服务器端操作
  • 需要 MongoDB 3.2+

猫鼬 populate()

  • 可以与find和一起使用aggregate
  • 可用于从分片和非分片集合中提取参考文档
  • 只能通过以下方式拉入参考文档 _id
  • 没有MongoDB版本要求

  • @AdrianMoisa `aggregate` 可以,但不能 `$lookup`。我为此添加了文档链接。 (2认同)