12 【操作mongodb数据库】

1.简介

1.Mongoose是一个让我们可以通过Node来操作MongoDB的模块。

2.Mongoose是一个对象文档模型(ODM)库,它对Node原生的MongoDB模块进行了进一步的优化封装,并提供了更多的功能。在大多数情况下,它被用来把结构化的模式应用到一个MongoDB集合,并提供了验证和类型转换等好处

3.mongoose中的对象:

Schema 模式对象(Schema对象定义约束了数据库中的文档结构)

Model 模型对象(Model对象作为集合中的所有文档的表示,相当于MongoDB数据库中的集合collection)

Document 文档对象(Document表示集合中的具体文档,相当于集合中的一个具体的文档)

mongoose的好处

可以为文档创建一个模式结构(Schema)

可以对模型中的对象/文档进行验证

数据可以通过类型转换转换为对象模型

可以使用中间件来应用业务逻辑挂钩

比Node原生的MongoDB驱动更容易

安装

npm i -S mongoose

2.连接数据库

config/db.config.js

// 1.引入mongoose

const mongoose = require("mongoose");

// 2.连接mongodb数据库

// 指定连接数据库后不需要存在,当你插入第一条数据库后会自动创建数据库

/*

mongoose.connect('mongodb://数据库地址:端口号/数据库名',{useMongoClient:true})

如果端口号是默认端口号(27017)则可以省略不写

*/

mongoose.connect("mongodb://localhost:27017/ds2", {

useNewUrlParser: true,

useUnifiedTopology: true,

});

// 3.监听mongodb数据库的连接状态

// 绑定数据库连接成功事件

mongoose.connection.once("open", function () {

console.log("连接成功");

});

// 绑定数据库连接失败事件

mongoose.connection.once("close", function () {

console.log("数据库连接已经断开");

});

// 4.断开数据库连接(一般不用)

mongooes.disconnect();

注:MongoDB数据库,一般情况下,只需要连接一次,连接一次后,除非项目停止服务器关闭,否则连接一般不会断开

在bin目录下的www文件中使用直接require(“…/config/db.config.js”)进行数据库连接的启动

3.创建模式对象和模型对象

数据库中的 Schema,为数据库对象的集合。schema 是 mongoose 里会用到的一种数据模式,可以理解为表结构的定义;每个 schema会映射到 mongodb 中的一个 collection,它不具备操作数据库的能力。

每个 schema 都会映射到一个 MongoDB collection 并定义这个collection里的文档结构

支持的字段类型

类型

作用

String

定义字符串

Number

定义数字

Date

定义日期

Buffer

定义二进制

Boolean

定义布尔值

Mixed

定义混合类型

ObjectId

定义对象ID

Array

定义数组

model/UserModel.js

const mongoose = require("mongoose")

const Schema=mongooes.Schema;

//创建模式对象

const UserType=new Schema({

name:{

type: 'string',

//添加约束,保证数据的完整性,让数据按规矩统一

require: true

},

age:Number,

gender:{

type:String,

// 默认值

default:'female'

},

address:String

})

//创建模型对象

//通过Schema来创建Model

//Model代表的是数据库中的集合,通过Model才能对数据库进行操作

//mongoose.model(modelName,schema)

//建立映射关系,students是集合,mongoose会自动将集合变成复数比如student会变成students

//大写也会被自动转换为小写,比如Users会变成users

const UserModel=mongoose.model("UserModel",UserType,"user");

//第一个参数表示创建的集合的名称,第二个参数表示利用的模式对象,第三个参数是强行指定集合名称

module.exports = UserModel

4.文档新增

4.1 save()

操作的是文档

案例:

var mongoose = require('mongoose')

const UserModel = require('../model/UserModel');

//链式调用 通过new 一个Model创建一个 document

new UserModel({

name:"小明",age:18}).save((err,docs) => {

if(!err){

console.log(docs)

res.send({

code: 200,

data: {

id: docs._id,

},

})

//{ _id: 6017bd1cf4cc8544d8ed2a8a, name: '小明', age: 18, __v: 0 }

}

})

4.2 create()

操作模型

Model.create(doc(s), [callback])

参数: [doc(s)]:文档对象或文档对象数组 [callback]:回调函数

var mongoose = require('mongoose')

const UserModel = require('../model/UserModel');

UserModel.create({

name:"小明",age:18},{

name:"小红",age:10},(err,doc1,doc2) => {

if(!err){

console.log(doc1)

//{ _id: 6017be2d77c8dd01242624bb, name: '小明', age: 18, __v: 0 }

console.log(doc2)

//{ _id: 6017be2d77c8dd01242624bc, name: '小红', age: 10, __v: 0 }

}

})

其它:

//Model.createOne(doc, [callback]); 创建一个对象

//Model.createMany(doc, [callback]); 创建多个对象

// -doc是需要插入的文档

// -callback(err) 是回调函数,可以用来提示是否创建成功了

4.3 insertMany()

Model.insertMany(doc(s), [options], [callback])

返回值为一个数组

案例:

UserModel.insertMany({

name:"小明",age:18},{

name:"小芳",age:14},(err,docs) => {

if(!err){

console.log(docs)

/*[{ _id: 6017befb5c36d64d08b72576, name: '小明', grades: 68, __v: 0 },

{ _id: 6017befb5c36d64d08b72577, name: '小芳', grades: 94, __v: 0 }]*/

}

})

5.文档查询

_id

name

grades

__v

6017befb5c36d64d08b72576

小明

68

0

6017befb5c36d64d08b72577

小芳

94

0

6017c455ba09d355a49ec8eb

小红

52

0

6017c455ba09d355a49ec8ec

小刚

46

0

5.1 find()

Model.find(conditions, [projection], [options], [callback])

参数

​ conditions:查询条件

​ [projection]:控制返回字段

​ [options]:配置查询参数

​ [callback]:回调函数–function(err,docs){}

案例: var mongoose = require('mongoose')

mongoose.connect('mongodb://localhost:27017/student',(err) => {

if(!err){

var schema = new mongoose.Schema({

name:String,grades:Number})

var stuModel = mongoose.model('grades',schema)

//查询所有数据

stuModel.find((err,docs) => {

if(!err){

console.log(docs)

}

})

/* [{ _id: 6017befb5c36d64d08b72576, name: '小明', grades: 68, __v: 0 },

{ _id: 6017befb5c36d64d08b72577, name: '小芳', grades: 94, __v: 0 },

{ _id: 6017c455ba09d355a49ec8eb, name: '小红', grades: 52, __v: 0 },

{ _id: 6017c455ba09d355a49ec8ec, name: '小刚', grades: 46, __v: 0 }]*/

//查询成绩大于60以上的数据

stuModel.find({

grades:{

$gte:60}},(err,docs) => {

if(!err){

console.log(docs)

}

})

/*[{ _id: 6017befb5c36d64d08b72576, name: '小明', grades: 68, __v: 0 },

{ _id: 6017befb5c36d64d08b72577, name: '小芳', grades: 94, __v: 0 }]*/

//查询成绩大于60以上且名字里存在‘芳’的数据

stuModel.find({

name:/芳/,grades:{

$gte:60}},(err,docs) => {

if(!err

精彩内容

评论可见,请评论后查看内容,谢谢!!!评论后请刷新页面。