Mongoose未填充MongoDB中的字段

2q5ifsrm  于 2022-11-13  发布在  Go
关注(0)|答案(1)|浏览(191)

当我运行下面的代码时,我得到了对象沿着控制台上记录的填充字段。Screenshot
但是,这些字段还没有填充到图书集合中。有人能帮我弄清楚吗?

const bookSchema = new Schema({
  title: String,
  genre: { type: Schema.Types.ObjectId, ref: "genre" },
  author: { type: Schema.Types.ObjectId, ref: "author" },
  numberInStock: { type: Number, default: 0 },
  rating: Number,
  yearPublished: Number,
  dateAdded: { type: Date, default: Date.now },
  liked: { type: Boolean, default: false },
});
const genreSchema = new Schema({ name: String });
const authorSchema = new Schema({ name: String });

const Book = model("book", bookSchema);
const Genre = model("genre", genreSchema);
const Author = model("author", authorSchema);

const books = [
  {
    title: "Sapiens",
    genre: "632873144b0bbfc10ae1942d",
    author: "632873e706fe265eaee77de3",
    numberInStock: 6,
    rating: 4.4,
    yearPublished: 2011,
  },
];

async function saveBook(b) {
  let book = new Book(b);
  book
    .save()
    .then((result) => {
      populateBook(result._id);
    })
    .catch((err) => console.log("Error: ", err));
}

function populateBook(id) {
  Book.findById(id)
    .populate("genre")
    .populate("author")
    .exec((err, book) => {
      if (err) {
        console.log("Error: ", err);
        return;
      }
      console.log(book);
    });
}

books.forEach((b) => {
  saveBook(b);
});
kmpatx3s

kmpatx3s1#

这就是population的工作原理,它只存储对数据库中其他文档的引用。在查询时,如果你要求它(使用.populate()),Mongoose将检索引用的文档并将它们插入到“父”文档中。
如果您希望引用的文档存储在数据库中,则不能使用population,而必须使用subdocuments
但是,这将限制数据库的灵活性,因为如果需要更改作者姓名,则需要更改数据库中的所有Book文档来更新作者姓名。使用填充,只需更改Author文档。

相关问题