Nodejs 操作 MongoDB
-
使用官方的
MongoDB
包:https://github.com/mongodb/node-mongodb-native
-
使用第三方的
mongoose
来操作MongoDB
数据库mongoose
是基于MongoDB
官方的mongodb
包再一次做了封装-
mongoose 官网:https://mongoosejs.com/
安装命令npm i mongoose
-
连接 MongoDB 数据库
mongoose.connect(uri[, option][, callback]):该方法用于与 MongoDB 数据库建立连接
mongoose
导入的 mongoose 模块
参数
rui
连接 MongoDB 数据库的地址options
该参数是一个对象,用于设置一些选项,这些选项会被传到底层 MongoDB 驱动callback
创建集合
mongoose 的一切都始于 Schema, 通过 mongoose 导出的 Schema 构造函数可以创建集合,设定集合的结构(规则);mongoose 中的集合就相当于关系型数据库中的表结构,可以设置集合中字段的类型,默认值、约束等。
Schema(definition[,options]):构造函数,通过该函数可以设计集合的结构,然后通过 new 创建实例对象;使用该构造函数时要通过 mongoose.Schema 获取,比如:new mongoose.Schema()
参数:
definition
该参数是一个对象,通过该参数定义集合中的字段并对字段设置相关约束options
应用规则
mongoose.model(name[,schema]):将文档结构发布为模型(应用规则);返回值为模型构造函数。
参数
name
字符串,首字母大写的名词的单数形式,用来表示文档(模型)的名称; mongoose 会自动将该单词生成小写复数的集合名称schema
该参数为设计的集合结构 (规则)
创建文档1
所谓的创建文档就是向集合中插入数据,该过程分为两步:创建集合实例,然后调用实例对象下的 save 方法将数据保存到数据库中
创建集合实例:
获取 model() 方法的返回的构造函数,该构造函数接收一个对象为参数,通过这个对象传入具体的数据,然后通过 new 关键字来创建实例对象
保存数据:
Model.prototype.save([options][,options.safe][,options.validateBeforeSave][,fn] ):该方法为 Model 原型上的方法,用于保存数据;有多个参数常用的为 fn
参数
fn
在数据保存完成后执行的回调函数,该函数有两个参数:错误对象 err,没有错误时值为 null;另一个参数为执行结果 doc(就是保存的数据)
创建文档2
Model.create(doc[,callback]) 将一个或多个文档保存到数据库的快捷方式;该方法的返回值为 promise 对象。
Model
调用 model() 方法后的返回值
参数
doc
需要插入集合中的文档,该参数可以是对象或数组callback
数据插入完成后执行的回调函数;该函数有两个参数:错误参数对象 err 和保存的数据 doc
因为该方法的返回值为 promise 对象,所以可以省略回调函数,直接使用链式编程的方式。
下面举个例子:
// 引包
const mongoose = require('mongoose')
// 连接 MongoDB 数据库,数据库不存在时会自动创建
mongoose
.connect('mongodb://localhost/userInfo', {
useNewUrlParser: true,
useUnifiedTopology: true
})
.then(() => console.log('数据库连接成功'))
.catch(err => console.log('数据库连接失败', err))
// 设计集合结构(类似于表结构)
const userSchema = new mongoose.Schema({
username: {
type: String, // 设置字段类型
required: true // 约束不能为空
},
age: Number,
gender: Boolean,
hobby: Array
})
// 应用集合
let User = mongoose.model('User', userSchema)
/* 创建文档1 */
// 拿到模型构造函数,开始为所欲为(插入数据)
let admin = new User({
username: 'admin',
age: 19,
gender: false,
hobby: ['book', 'music', 'shopping']
})
// 数据持久化(保存数据)
admin.save((err, res) => {
if (err) console.log('保存失败!', err)
else console.log('保存成功!', res)
})
/* 创建文档2 */
// 通过该方法不需要去实例化集合
User.create(
{
username: 'VIP',
age: 18,
gender: true,
hobby: ['running', 'basketball', 'anime']
},
(err