Mongoose 是一款流行的 MongoDB Node.js ORM 库,它可以方便的帮助我们进行 MongoDB 数据库的增删改查操作。在 Mongoose 中使用 populate 方法,我们可以方便的进行集合间的关联查询,尤其适合用来解决一对多或者多对多的关系。
本文将详细介绍 Mongoose 中的 populate 方法,并结合示例代码进行说明,希望能给大家带来收获和帮助。
什么是 populate 方法?
populate 方法是 Mongoose 中的一个常用方法,它能够通过一个属性引用查询其关联的对象属性。它将在查询文档时,自动填充关联属性的值,使我们得以方便的进行关联属性的查询。
如何使用 populate 方法?
在 Mongoose 中,我们可以使用 populate 方法来完成反向查询。即在查询中,从关联的集合反向查找其关联集合的信息。
我们先来创建一个具有关联关系的数据模型:
// javascriptcn.com 代码示例 var mongoose = require("mongoose"); var Schema = mongoose.Schema; var authorSchema = new Schema({ name: String, books: [{ type: mongoose.Schema.Types.ObjectId, ref: "books" }], }); var bookSchema = new Schema({ title: String, author: { type: mongoose.Schema.Types.ObjectId, ref: "authors" }, }); var Author = mongoose.model("authors", authorSchema); var Book = mongoose.model("books", bookSchema);
在上述的代码中,我们定义了两个数据模型,一个是 Author
,一个是 Book
。其中 Author
模型中包含两个属性,一个是名字 name
,一个是图书 books
的 Id,books
是一个包含多个 ObjectId
类型的数组,指向另一个数据模型 Book
。而 Book
模型中则包含两个属性,一个是书名 title
,一个是作者 author
的 Id,author
是一个 ObjectId
类型,指向 Author
集合中的一个作者。
接下来我们来模拟一些测试数据,用于查询操作:
// javascriptcn.com 代码示例 var arrBooks = [{ title: "Node.js in Action" }, { title: "Learning JavaScript" }, { title: "JavaScript: The Definitive Guide" }]; var arrAuthors = [{ name: "Mike" }, { name: "Tom" }]; Book.remove({}, function () { arrBooks.forEach(function (book) { var b = new Book(book); b.save(); }); }); Author.remove({}, function () { arrAuthors.forEach(function (author) { var a = new Author(author); a.books = [arrBooks[0]._id, arrBooks[1]._id]; a.save(); }); });
在代码中,我们先创建了一个数组 arrBooks
和 arrAuthors
,分别保存了三个书籍和两位作者的信息。然后分别使用 Book.remove
和 Author.remove
方法删除两个集合的所有文档。最后通过 new Book(book)
和 new Author(author)
方法,创建并保存了对应的文档。
之后我们使用以下代码来查找作者 Mike
发表的书籍:
Author.findOne({ name: "Mike" }).populate("books").exec(function (err, author) { console.log(author.books); });
在查询 Author
集合中的文档后,我们调用 populate("books")
方法,指示 Mongoose 自动填充作者的 books
属性。最后使用中间件 exec
函数来执行查询操作。
输出结果为:
[ { _id: 5b53638972f8a44b2cf94681, title: 'Node.js in Action', author: 5b53638972f8a44b2cf94680 }, { _id: 5b53638972f8a44b2cf94682, title: 'Learning JavaScript', author: 5b53638972f8a44b2cf94680 } ]
我们发现 author.books
属性已经被成功填充上了 Mike
所发布的两本书。这样我们就能方便的获得与指定书籍作者相关联的信息了。
总结
使用 Mongoose 中的 populate 方法,我们可以方便地进行反向查询操作,可以大大的简化我们的代码,避免了过于繁琐的手动查询操作。希望本文的代码示例以及指导意义能在实际工作中帮助到大家。
来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/6540a4cc7d4982a6eba29e50