Mongoose 是 Node.js 环境下 MongoDB 的一个对象模型工具,它提供了简单、直观的 API,可以方便地进行数据库操作。在使用 Mongoose 进行开发时,有时需要对 MongoDB 集合名进行自定义,或者在多个文档模型之间建立关系。本文将详细介绍如何在 Mongoose 中实现这些功能,并提供示例代码。
设置 MongoDB 集合名
默认情况下,Mongoose 会根据模型名自动创建一个与之对应的集合,并将其命名为模型名的小写复数形式。例如,如果有一个名为 User
的模型,它对应的集合名就是 users
。如果需要对集合名进行自定义,可以在定义模型时传入第二个参数,指定集合名。例如:
const userSchema = new mongoose.Schema({ name: String, age: Number }, { collection: 'myusers' }); const User = mongoose.model('User', userSchema);
上面的代码中,我们将集合名设置为 myusers
,而不是默认的 users
。
建立文档模型之间的关系
在 Mongoose 中,有三种文档模型之间的关系:一对一、一对多和多对多。这些关系可以通过在模型中定义字段来实现。
一对一关系
一对一关系指的是两个文档模型之间的关系是唯一的。例如,一个用户只能有一个身份证号码,一个身份证号码也只能对应一个用户。在 Mongoose 中,可以使用 populate
方法来实现一对一关系。例如:
// javascriptcn.com 代码示例 const userSchema = new mongoose.Schema({ name: String, age: Number, idCard: { type: mongoose.Schema.Types.ObjectId, ref: 'IdCard' } }); const idCardSchema = new mongoose.Schema({ number: String, user: { type: mongoose.Schema.Types.ObjectId, ref: 'User' } }); const User = mongoose.model('User', userSchema); const IdCard = mongoose.model('IdCard', idCardSchema); // 创建一个用户和一个身份证号码 const user = new User({ name: '张三', age: 18 }); const idCard = new IdCard({ number: '123456789', user: user._id }); // 将身份证号码关联到用户 user.idCard = idCard._id; // 保存用户和身份证号码到数据库 user.save(); idCard.save(); // 查询用户并关联身份证号码 User.findOne({ name: '张三' }).populate('idCard').exec((err, user) => { console.log(user); });
上面的代码中,我们定义了两个模型:User
和 IdCard
。其中,User
模型中有一个 idCard
字段,类型为 mongoose.Schema.Types.ObjectId
,表示该用户对应的身份证号码的 _id
。IdCard
模型中有一个 user
字段,类型为 mongoose.Schema.Types.ObjectId
,表示该身份证号码对应的用户的 _id
。我们在创建用户和身份证号码时,将身份证号码的 user
字段关联到用户的 _id
,并将身份证号码的 _id
赋值给用户的 idCard
字段。在查询用户时,使用 populate
方法将 idCard
字段关联到身份证号码模型上,从而实现了一对一关系。
一对多关系
一对多关系指的是一个文档模型对应多个另一个文档模型。例如,一个用户可以有多个订单,一个订单只能对应一个用户。在 Mongoose 中,可以使用 populate
方法和 virtual
字段来实现一对多关系。例如:
// javascriptcn.com 代码示例 const userSchema = new mongoose.Schema({ name: String, age: Number }); const orderSchema = new mongoose.Schema({ number: String, user: { type: mongoose.Schema.Types.ObjectId, ref: 'User' } }); orderSchema.virtual('userDetail', { ref: 'User', localField: 'user', foreignField: '_id', justOne: false }); const User = mongoose.model('User', userSchema); const Order = mongoose.model('Order', orderSchema); // 创建一个用户和两个订单 const user = new User({ name: '张三', age: 18 }); const order1 = new Order({ number: '123456', user: user._id }); const order2 = new Order({ number: '789012', user: user._id }); // 保存用户和订单到数据库 user.save(); order1.save(); order2.save(); // 查询用户和关联的订单 User.findOne({ name: '张三' }).populate('orders').exec((err, user) => { console.log(user); }); // 查询订单和关联的用户 Order.findOne({ number: '123456' }).populate('userDetail').exec((err, order) => { console.log(order); });
上面的代码中,我们定义了两个模型:User
和 Order
。其中,Order
模型中有一个 user
字段,类型为 mongoose.Schema.Types.ObjectId
,表示该订单对应的用户的 _id
。我们在创建用户和订单时,将订单的 user
字段关联到用户的 _id
。在查询用户时,使用 populate
方法将 orders
字段关联到订单模型上,从而实现了一对多关系。在查询订单时,使用 virtual
字段将 user
字段关联到用户模型上,从而实现了多对一关系。
多对多关系
多对多关系指的是两个文档模型之间的关系是多对多的。例如,一个学生可以选修多个课程,一个课程也可以被多个学生选修。在 Mongoose 中,可以使用 ref
字段和 populate
方法来实现多对多关系。例如:
// javascriptcn.com 代码示例 const studentSchema = new mongoose.Schema({ name: String, age: Number, courses: [{ type: mongoose.Schema.Types.ObjectId, ref: 'Course' }] }); const courseSchema = new mongoose.Schema({ name: String, teacher: String, students: [{ type: mongoose.Schema.Types.ObjectId, ref: 'Student' }] }); const Student = mongoose.model('Student', studentSchema); const Course = mongoose.model('Course', courseSchema); // 创建两个学生和两门课程 const student1 = new Student({ name: '张三', age: 18 }); const student2 = new Student({ name: '李四', age: 20 }); const course1 = new Course({ name: '数学', teacher: '王老师' }); const course2 = new Course({ name: '英语', teacher: '李老师' }); // 将学生和课程进行关联 student1.courses.push(course1._id); student1.courses.push(course2._id); student2.courses.push(course2._id); course1.students.push(student1._id); course2.students.push(student1._id); course2.students.push(student2._id); // 保存学生和课程到数据库 student1.save(); student2.save(); course1.save(); course2.save(); // 查询学生和关联的课程 Student.findOne({ name: '张三' }).populate('courses').exec((err, student) => { console.log(student); }); // 查询课程和关联的学生 Course.findOne({ name: '数学' }).populate('students').exec((err, course) => { console.log(course); });
上面的代码中,我们定义了两个模型:Student
和 Course
。其中,Student
模型中有一个 courses
字段,类型为数组,表示该学生选修的课程的 _id
。Course
模型中有一个 students
字段,类型为数组,表示该课程被哪些学生选修的 _id
。我们在创建学生和课程时,将学生的 courses
字段关联到课程的 _id
,将课程的 students
字段关联到学生的 _id
。在查询学生和课程时,使用 populate
方法将 courses
字段关联到课程模型上,从而实现了多对多关系。在查询课程和学生时,使用 populate
方法将 students
字段关联到学生模型上,从而实现了多对多关系。
总结
本文介绍了在 Mongoose 中如何设置 MongoDB 集合名和多个文档模型之间的关系。其中,设置集合名可以在定义模型时传入第二个参数,指定集合名。建立文档模型之间的关系有三种:一对一、一对多和多对多。这些关系可以通过在模型中定义字段来实现。一对一关系可以使用 populate
方法来实现,一对多关系可以使用 populate
方法和 virtual
字段来实现,多对多关系可以使用 ref
字段和 populate
方法来实现。这些功能对于开发复杂的应用程序非常有用,可以帮助开发者更方便地进行数据库操作。
来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/65794318d2f5e1655d34393d