MongoDB和mongoose
Mongoose是MongoDB的一个对象模型工具,是基于node-mongodb-native开发的MongoDB nodejs驱动,可以在异步的环境下执行。同时它也是针对MongoDB操作的一个对象模型库,封装了MongoDB对文档的的一些增删改查等常用方法,让NodeJS操作Mongodb数据库变得更加灵活简单。
它的作用就是,在程序代码中,定义一下数据库中的数据格式,然后取数据时通过它们,可以把数据库中的 document 映射成程序中的一个对象,这个对象有 .save .update 等一系列方法,和 .title .author 等一系列属性。在调用这些方法时,odm 会根据你调用时所用的条件,自动转换成相应的 mongodb shell 语句帮你发送出去。自然地,在程序中链式调用一个个的方法要比手写数据库操作语句具有更大的灵活性和便利性。
const mongoose = require('mongoose')
const db = 'mongodb://localhost/jinghong'
// 用原生Promise代替mongoose中的promise
mongoose.Promise = global.Promise
exports.connect = () => {
let connectLimit = 0
return new Promise((resolve, reject) => {
if (process.env.NODE_ENV !== 'production') {
mongoose.set('debug', true)
}
mongoose.connect(db, { useNewUrlParser: true })
mongoose.connection.on('disconnected', () => {
if (connectLimit < 5) {
// 断开重连
mongoose.connect(db, { useNewUrlParser: true })
connectLimit ++
} else {
const err = new Error('链接失败超过五次')
reject(err)
}
})
mongoose.connection.on('error', err => {
reject(err)
})
// 链接成功
mongoose.connection.once('open', () => {
const Dog = mongoose.model('Dog', {
name: String
})
const catty = new Dog({
name: 'supper catty'
})
catty.save().then(() => {
//存储成功
console.log('catty存储成功')
})
resolve('链接成功')
})
})
}
其中
const db = ‘mongodb://localhost/jinghong’
localhost 是 mongoDB 所在的地址,端口号省略则默认连接 27017;jinghong 是数据库的名称。
异步调用:
;(async() => {
try{
const status = await connect()
console.log(status)
} catch (err) {
console.log(err)
}
})()
链接失败的时候还可以这样去写
mongoose.connection.on('error', err => {
throw new Error('制作错误')
})
查看MongoDB存储的数据
在命令行中输入:mongo,接着输入下图所示相关信息即可
MongoDB中document、collection、database三个概念
Mongoose中schema、model、entity三个概念
- Schema : 一种以文件形式存储的数据库模型骨架,不具备数据库的操作能力
- Model : 由Schema发布生成的模型,具有抽象属性和行为的数据库操作对
- Entity : 由Model创建的实体,他的操作也会影响数据库
它们之间的关系是Schema生成Model,Model创造Entity,Model和Entity都可对数据库操作造成影响,但Model比Entity更具操作性。Model对应collection,Entity对应docment