mongodb - 在 Mongoose 中使用 $lookup 检索引用字段的最佳方法?

标签 mongodb mongoose aggregation-framework

我有两个模型 BookAuthor,Book 有作者的引用,假设一个作者被删除了那么我只想检索那些有作者的书:

BookSchema 具有这些字段

name: String,
author: {
  type: Schema.Types.ObjectId,
  ref: 'Author',
  required: [true, 'A book must have an author']
}

AuthorSchema 具有这些字段

name: String

我必须使用 $lookup 运算符来完成它。我能够得到想要的结果,但我不知道这是否是一个好方法。这是我的解决方案:

const books = await Book.aggregate([
      {   $lookup: {
          from: 'authors',
          localField: 'author',
          foreignField: '_id',
          as: 'bookAuthor'
          }
      },
      {   $match: {   bookAuthor: { $not: { $size: 0 } }   }   },
      {   $unwind: '$bookAuthor'   },
      {   $project: {
          name: 1,
          bookAuthor: {   name: 1   }
          }
      }
    ]);

最佳答案

您已正确完成所有操作,但您不需要在 aggregation 管道的第二阶段使用 $match$unwind会自动移除bookAuthor数组为空的文档,所以如果没有author,会在$unwind之后移除阶段。

试试这个:

const books = await Book.aggregate([
  {   $lookup: {
      from: 'authors',
      localField: 'author',
      foreignField: '_id',
      as: 'bookAuthor'
      }
  },
  {   $unwind: '$bookAuthor'   },
  {   $project: {
      name: 1,
      bookAuthor: {   name: 1   }
      }
  }
]);

看看这个Mongo Playground看到它工作

关于mongodb - 在 Mongoose 中使用 $lookup 检索引用字段的最佳方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64982331/

相关文章:

javascript - Node.js Promise 与 Mongoose

mongodb - mongodb 中日期的分钟差异

database - MongoDB 从多个文档中提取子文档数组值

java - Spring boot/Java、mongodb SSL/TLS 连接

javascript - 调用服务器端方法时 Meteor 中的错误处理

javascript - 在 Javascript 对象上使用 JSON.stringify 插入反斜杠

node.js - Mongoose:嵌套数组结构中的聚合查询

javascript - 强制 MongoDB 文档中的 Javascript 数字加倍?

javascript - 它如何与 mongoose 多次更新一起使用?

node.js - 在 mongoose Schema 文件 Nestjs 中使用进程 env