如何在Mongoose中使用$lookup最佳方法检索引用字段?

3

我有两个模型BookAuthor,Book有一个指向Author的引用,如果一个Author被删除,那么我只想检索那些有作者的书:

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   }
          }
      }
    ]);
1个回答

3
您已经做得很正确了,但在聚合管道的第二个阶段中,您不需要使用$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,以查看它的工作方式。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接