【问题标题】:mongodb aggregate two collections and add new fieldsmongodb聚合两个集合并添加新字段
【发布时间】:2021-06-26 00:02:08
【问题描述】:

我有两个收藏:authorsbooks

作者示例:

{
   _id: "605f6746c114544ee04228bd"
   firstName: "firstName",
   lastName: "lastName",
}

书籍示例:

{
   _id: "605f6746c114544ee04228bd"
   title: "title",
   pages: 350,
}

我想获取作者名字和姓氏的书籍列表。

这是我当前的代码:

let books;

books = await Book.find();
books.forEach(async (book, i) => {
  const author = await Author.findOne(
    { _id: book.authorId },
    { firstName: 1, lastName: 1, _id: 0 }
  );
  books[i].authorFirstName = author.firstName;
  books[i].authorLastName = author.lastName;
});

这不是一个好习惯,因为对于每本书,我都会对 mongodb 数据库执行另一个请求! 有更好的解决方案吗?

【问题讨论】:

  • 使用mongoose.populate,就是将两个模型链接在一起的方式
  • 谢谢@Mastermind 它有效

标签: node.js database mongodb mongoose aggregate


【解决方案1】:

使用猫鼬填充的简洁代码和更高性能

  import Book from "../models/Book";
  import Author from "../models/Author";

  let books = await Book.find().populate({
    path: "authorId",
    model: Author,
    select: { firstName: 1, lastName: 1, _id: 0 },
  });

【讨论】:

    【解决方案2】:

    猫鼬版加入两个有关系的模型

    books = await Book.find({}).populate({ path:"authorId", select:{firstName:1, lastName:1}})
    

    使用聚合

    let books = await Book.aggregation([
       { 
         $lookup:{
            from:"collection_of_author",
            localField: "authorId",
            foreignField: "_id",
            as: "author"
         }
       },
      {
        $unwind: {
           path:"authorId",
           preserveNullAndEmptyArrays:true 
        }
      }])
    

    【讨论】:

      猜你喜欢
      • 2021-12-12
      • 1970-01-01
      • 2021-12-16
      • 2019-05-16
      • 1970-01-01
      • 2020-12-10
      • 1970-01-01
      • 2017-07-13
      • 1970-01-01
      相关资源
      最近更新 更多