数据库简单的增删改查是很容易但是真正到了项目中有些地方就需要两张甚至多张表进行关联,这样的话难度瞬间上了一个档次。
mongoose给了我们很好地解决办法。
模型层
因为要联表所以要建立两个模型,这边我们要做的是通过order表去查询user表的参数
order
const Mongoose = require('mongoose')
const order = new Mongoose.Schema({
orderNum: String,
user: String,
userName: {
type: Mongoose.Schema.Types.ObjectId,//联表查询必须这样的格式来存储对应表的._id
ref: 'user'//联表关系的表名
}
})
module.exports = Mongoose.model('order',order)
这里的重点就在order模型中定义的userName
字段的类型是Mongoose.Schema.Types.ObjectIdmongodb的集合中每条数据默认存在的_id类型,ref是要关联的集合模型
user
const Mongoose = require('mongoose') var user = new Mongoose.Schema({ user: String, age: String, inter: Object }) module.exports = Mongoose.model('user',user)
没什么好说的普通的模型创建
控制层
const user = require('../model/user') const order = require('../model/order')
存储
var userTest = new user({ user: '测试名字', age: 29, inter: { sport: 'football', eat: 'apple' } }) userTest.save(function (err,res) { if (err) { console.log(err,'错误了') } else { console.log('创建集合成功',res) var orderTest = new order({ orderNum: '12354645', user: '测试名字', userName: res._id//用来存储关联表查出的数据 }) orderTest.save() } })
先执行存储,先存user数据然后在成功的回调中存order数据(因为要拿到存储user数据的_id),将user数据的_id设置到order数据的userName中。
查询
var a = await order.find({user: '测试名字'}) //populate()第一个参数表示通过什么字段去联表并用来放入查到的联表数据, //populate()第二个参数表示只返回某个字段默认全部返回 .populate('userName','age') // .exec(function (err,data) { // console.log(data) // }) //exec()是回调操作没有exec()操作才能打印出完整a console.log('我是a',a)
通过mongoose模型的.populate来联表查询。大致的流程我理解成一下三步:
1、先查询到order表的{user: '测试名字'}这条数据
2、通过这条数据中的userName中的_id去找user表中的相同_id的那条数据
3、查询到后将查询到的数据放到userName(相当于将原本字段中的_id替换成查询到的user表数据)
查询结果
联表查询和存储是很重要的功能在项目中肯定会用到这里先记录下。