我有两个合集:作者和书籍
作者示例:
{
_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 数据库执行另一个请求! 有更好的解决方案吗?
答案 0 :(得分:1)
猫鼬版本加入两个有关系的模型
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
}
}])
答案 1 :(得分:0)
使用 mongoose populate 清洁代码并提高性能
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 },
});