Mongoose 中的 subdocument 使用技巧及注意点
Mongoose 是一个 Node.js 的 ORM 框架,提供了丰富的 API 来操作 MongoDB 数据库。在 Mongoose 中,subdocument 是一个非常重要的概念,它可以用来表示一个文档中的嵌套文档。本文将介绍 Mongoose 中 subdocument 的使用技巧及注意点。
一、创建 subdocument
在 Mongoose 中,我们可以使用 Schema.Types.Embedded 或者 Schema.Types.DocumentArray 来定义一个 subdocument。两者的区别在于,Schema.Types.Embedded 定义的 subdocument 是一个单独的文档,而 Schema.Types.DocumentArray 定义的 subdocument 是一个文档数组。
下面是一个使用 Schema.Types.Embedded 定义 subdocument 的例子:
// javascriptcn.com 代码示例 const mongoose = require('mongoose'); const Schema = mongoose.Schema; const addressSchema = new Schema({ street: String, city: String, state: String, zip: String }); const personSchema = new Schema({ name: String, age: Number, address: addressSchema });
在上面的例子中,我们定义了一个 personSchema,其中包含一个 name 字段、一个 age 字段和一个 address 字段,address 字段是一个 subdocument,使用了 addressSchema 定义。
二、操作 subdocument
- 添加 subdocument
在 Mongoose 中,我们可以使用 push() 方法来向 subdocument 中添加一个文档。例如,我们可以向上面的 personSchema 中的 address 字段添加一个新的地址:
// javascriptcn.com 代码示例 const Person = mongoose.model('Person', personSchema); const person = new Person({ name: 'John', age: 30, address: { street: '123 Main St', city: 'New York', state: 'NY', zip: '10001' } }); person.address.push({ street: '456 Elm St', city: 'Los Angeles', state: 'CA', zip: '90001' });
在上面的例子中,我们首先创建了一个 Person 文档,然后向它的 address 字段中添加了一个新的地址。
- 删除 subdocument
我们可以使用 remove() 方法来删除 subdocument。例如,我们可以删除上面的 personSchema 中的 address 字段中的第一个地址:
person.address[0].remove();
在上面的例子中,我们使用 remove() 方法来删除 personSchema 中 address 字段中的第一个地址。
- 更新 subdocument
我们可以使用 set() 方法来更新 subdocument。例如,我们可以更新上面的 personSchema 中的 address 字段中的第一个地址:
person.address[0].set({ street: '789 Oak St', city: 'Chicago', state: 'IL', zip: '60601' });
在上面的例子中,我们使用 set() 方法来更新 personSchema 中 address 字段中的第一个地址。
三、注意事项
- subdocument 中不能使用 _id 字段
在 Mongoose 中,subdocument 中不能使用 _id 字段。如果你需要在 subdocument 中使用 _id 字段,可以使用 Schema.Types.ObjectId 来定义一个新的字段。
例如,我们可以使用 Schema.Types.ObjectId 来定义一个新的 id 字段:
const addressSchema = new Schema({ id: Schema.Types.ObjectId, street: String, city: String, state: String, zip: String });
在上面的例子中,我们定义了一个 addressSchema,并在其中添加了一个 id 字段,使用了 Schema.Types.ObjectId。
- 使用 select() 方法查询 subdocument
在 Mongoose 中,如果你想查询 subdocument 中的某个字段,需要使用 select() 方法。例如,我们可以查询上面的 personSchema 中的 address 字段中的 city 字段:
Person.find({ 'address.city': 'New York' }) .select('address.city') .exec((err, persons) => { console.log(persons); });
在上面的例子中,我们使用 find() 方法来查询 address 字段中的 city 字段,然后使用 select() 方法来选择需要返回的字段。
- 使用 populate() 方法查询 subdocument
在 Mongoose 中,我们可以使用 populate() 方法来查询 subdocument 中的关联文档。例如,我们可以查询一个 blog 文档,并将其 comments 字段中的 user 字段关联的 user 文档一起查询出来:
// javascriptcn.com 代码示例 const blogSchema = new Schema({ title: String, content: String, comments: [{ user: { type: Schema.Types.ObjectId, ref: 'User' }, content: String }] }); const Blog = mongoose.model('Blog', blogSchema); Blog.findById(blogId) .populate('comments.user') .exec((err, blog) => { console.log(blog); });
在上面的例子中,我们使用 populate() 方法来查询 blog 文档中的 comments 字段,并将 comments 字段中的 user 字段关联的 user 文档一起查询出来。
四、总结
本文介绍了 Mongoose 中 subdocument 的使用技巧及注意点,包括创建 subdocument、操作 subdocument、注意事项等内容。希望本文能够对你学习和使用 Mongoose 有所帮助。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/65124cbb95b1f8cacdabebc0