1 MongoDB原生CRUD(增删改查)命令总结
-C creat(新增数据):
db.集合名.insert(文档对象)
db.集合名.insertOne(文档对象)
db.集合名.insertMany([文档对象,文档对象])
-R read:
db.集合名.find(查询条件[,投影])
举例:db.students.find({age:18}),查找年龄为18的所有信息
举例:db.students.find({age:18,name:'jack'}),查找年龄为18且名字为jack的学生
常用操作符:
1. < , <= , > , >= , !== 对应为: $lt $lte $gt $gte $ne
举例:db.集合名.find({age:{$gte:20}}),年龄是大于等于20的
2.逻辑或:使用$in 或 $or
查找年龄为18或20的学生
举例:db.students.find({age:{$in:[18,20]}})
举例:db.students.find({$or:[{age:18},{age:20}]})
3.逻辑非:$nin
4.正则匹配:
举例:db.students.find({name:/^T/})
5.$where能写函数:
db.students.find({$where:function(){
return this.name === 'zhangsan' && this.age === 18
}})
投影:过滤掉不想要的数据,只保留想要展示的数据
举例:db.students.find({},{_id:0,name:0}),过滤掉id和name
举例:db.students.find({},{age:1}),只保留age
补充:db.集合名.findOne(查询条件[,投影]),默认只要找到一个
-U update:
db.集合名.update(查询条件,要更新的内容[,配置对象])
//如下写法会将更新内容替换掉整个文档对象,但_id不受影响
举例:db.students.update({name:'zhangsan'},{age:19})
//使用$set修改指定内容,其他数据不变,不过只能匹配一个zhangsan
举例:db.students.update({name:'zhangsan'},{$set:{age:19}})
//修改多个文档对象,匹配多个zhangsan,把所有zhangsan的年龄都替换为19
举例:db.students.update({name:'zhangsan'},{$set:{age:19}},{multi:true})
补充:db.集合名.updateOne(查询条件,要更新的内容[,配置对象])
db.集合名.updateMany(查询条件,要更新的内容[,配置对象])
-D delete
db.集合名.remove(查询条件)
//删除所有年龄小于等于19的学生
举例:db.students.remove({age:{$lte:19}})
/*
* mongoDB:一个数据库品牌的名字
* mongod:启动数据库的命令
* mongo:连接接数据库的命令
* mongoose:在Node平台下,一个知名的用于帮助开发者连接mongoDB的包
* */
//为什么用mongoose? 想在Node平台下,更加简单、高效、安全、稳定的操作mongoDB
//当引入第三方库的时候,如果在本文件夹内没有找到node_modules,找外层文件夹,直到根目录
//引入mongoose
let mongoose = require('mongoose')
//1.连接数据库
mongoose.connect('mongodb://localhost:27017/demo',{
useNewUrlParser: true, //使用一个新的URL解析器,用于解决一些安全性问题。
useUnifiedTopology: true //使用一个统一的新的拓扑结构
})
//2.绑定数据库连接的监听
mongoose.connection.on('open',function (err) {
if(err){
console.log('数据库连接失败',err)
}else{
console.log('数据库连接成功')
//3.操作数据库
console.log('操作数据库')
}
})
2 mongoose原生CRUD(增删改查)命令总结
-Create
模型对象.create(文档对象,回调函数)
-Read
模型对象.find(查询条件[,投影],回调函数)不管有没有数据,都返回一个数组
模型对象.findOne(查询条件[,投影],回调函数)找到了返回一个对象,没找到返回null
-Update
模型对象.updateOne(查询条件,要更新的内容[,配置对象],回调函数)
模型对象.updateMany(查询条件,要更新的内容[,配置对象],回调函数)
备注:存在update方法,但是即将废弃,查询条件匹配到多个时,依然只修改一个,强烈建议用updateOne或updateMany
-Delete
模型对象.deleteOne(查询条件,回调函数)
模型对象.deleteMany(查询条件,回调函数)
备注:没有delete方法,会报错!
备注: 以上所有方法,如果没有指定回调函数,则返回值是一个Promise的实例
//引入mongoose
let mongoose = require('mongoose')
mongoose.set('useCreateIndex',true) //使用一个新的索引创建器
//1.连接数据库
mongoose.connect('mongodb://localhost:27017/demo',{
useNewUrlParser: true, //使用一个新的URL解析器,用于解决一些安全性问题。
useUnifiedTopology: true //使用一个统一的新的拓扑结构。
})
//2.绑定数据库连接的监听
mongoose.connection.on('open',function (err) {
if(err){
console.log('数据库连接失败',err)
}else{
console.log('数据库连接成功')
//3.操作数据库
//把数据库想象成你家的别墅
//1.请来一个帮你看门的保安 ------ 引入模式对象
let Schema = mongoose.Schema
//2.制定进入你家的规则 -------- 创建约束对象
let studentsRule = new Schema({
stu_id:{
type:String, //限制学号必须为:字符串
required:true,
unique:true
},
name:{
type:String, //限制姓名必须为:字符串
required:true, //限制姓名为必填项
},
age:{
type:Number, //限制年龄必须为:字符串
required:true, //限制年龄为必填项
},
sex:{
type:String, //限制性别必须为:字符串
required:true, //限制性别为必填项
},
hobby:[String], //限制爱好只能为数组,数组中的每一项必须为字符串
info:Schema.Types.Mixed, //接收所有类型
date:{
type:Date,
default:Date.now()
},
enable_flag:{
type:String,
default:'Y'
}
})
//3.告诉保安你的规则 ------- 创建模型对象
let stuModel = mongoose.model('students',studentsRule) //用于生成某个集合所对应的模型对象
//4.真正有人要进入你家了 -------- CRUD
//新增操作 --- C
stuModel.create({
stu_id:'004',
name:'强',
age:'42',
sex:'男',
hobby:['女','打代码','打篮球'], //限制爱好只能为数组,数组中的每一项必须为字符串
info:'一个风一样的男子', //接收所有类型
},function(err,data){
if (!err) console.log(data)
else console.log(err)
})
//查询 --- R
/*find方法:
1.返回的是一个数组,就算是一条数据,也包裹一个数组
2.若查询结果为空,则返回一个空数组。
*/
/*stuModel.find({name:'金龙老师'},function (err,data) {
if (!err) console.log(data)
else console.log(err)
})*/
/*find方法:
1.若有结果,返回的是一个对象
2.若没有结果,返回一个null
*/
/*stuModel.findOne({name:'班长'},{age:1,_id:0},function (err,data) {
if (!err) console.log(data)
else console.log(err)
})*/
//更新 --- U
/*stuModel.updateOne({name:'静静'},{age:16},function (err,data) {
if (!err) console.log(data)
else console.log(err)
})*/
//删除 --- D
/*stuModel.deleteMany({age:16},function (err,data) {
if (!err) console.log(data)
else console.log(err)
})*/
}
})
3 mongoose模块化
文件结构:
--demo
--db
--db.js
--model
--studentModel.js
--teacherModel.js
--app.js
核心要义:
将整个分为:数据库连接(及监听)+创建模型对象(模式对象–约束对象–模型对象)+通过模型对象的方法实现CRUD
- 数据库连接(及监听) demo/db/db.js
/*
* 该模块主要用于连接数据库,且判断数据库的连接状态
* */
let mongoose = require('mongoose')
mongoose.set('useCreateIndex',true) //使用一个新的索引创建器
const DB_NAME = 'demo'
const PORT = 27017
const IP = 'localhost'
function connectMongo(callback) {
//1.连接数据库
mongoose.connect(`mongodb://${IP}:${PORT}/${DB_NAME}`,{
useNewUrlParser: true, //使用一个新的URL解析器,用于解决一些安全性问题。
useUnifiedTopology: true //使用一个统一的新的拓扑结构。
})
//2.绑定数据库连接的监听
mongoose.connection.on('open',function (err) {
if(err){
console.log('数据库连接失败',err)
callback('connect failed')
}else{
console.log('数据库连接成功')
callback()
}
})
}
module.exports = connectMongo
- 创建模型对象(模式对象–约束对象–模型对象)
demo>model>studentModel.js
//把数据库想象成你家的别墅
let mongoose = require('mongoose')
//1.请来一个帮你看门的保安 ------ 引入模式对象
let Schema = mongoose.Schema
//2.制定进入你家的规则 -------- 创建约束对象
let studentsRule = new Schema({
stu_id:{
type:String, //限制学号必须为:字符串
required:true,
unique:true
},
name:{
type:String, //限制姓名必须为:字符串
required:true, //限制姓名为必填项
},
age:{
type:Number, //限制年龄必须为:字符串
required:true, //限制年龄为必填项
},
sex:{
type:String, //限制性别必须为:字符串
required:true, //限制性别为必填项
},
hobby:[String], //限制爱好只能为数组,数组中的每一项必须为字符串
info:Schema.Types.Mixed, //接收所有类型
date:{
type:Date,
default:Date.now()
},
enable_flag:{
type:String,
default:'Y'
}
})
//3.告诉保安你的规则 ------- 创建模型对象
module.exports = mongoose.model('students',studentsRule) //用于生成某个集合所对应的模型对象
demo>model>teacherModel.js
//把数据库想象成你家的别墅
let mongoose = require('mongoose')
//1.请来一个帮你看门的保安 ------ 引入模式对象
let Schema = mongoose.Schema
//2.制定进入你家的规则 -------- 创建约束对象
let teachersRule = new Schema({
teac_id:{
type:String, //限制学号必须为:字符串
required:true,
unique:true
},
name:{
type:String, //限制姓名必须为:字符串
required:true, //限制姓名为必填项
},
age:{
type:Number, //限制年龄必须为:字符串
required:true, //限制年龄为必填项
},
sex:{
type:String, //限制性别必须为:字符串
required:true, //限制性别为必填项
},
hobby:[String], //限制爱好只能为数组,数组中的每一项必须为字符串
info:Schema.Types.Mixed, //接收所有类型
date:{
type:Date,
default:Date.now()
},
enable_flag:{
type:String,
default:'Y'
}
})
//3.告诉保安你的规则 ------- 创建模型对象
module.exports = mongoose.model('teachers',teachersRule) //用于生成某个集合所对应的模型对象
- 通过模型对象的方法实现CRUD demo>app.js
//1.引入mongoose库
let mongoose = require('mongoose')
//2.引入数据库连接模块
let db = require('./db/db')
//3.引入学生模型
let stuModel = require('./model/studentModel')
//引入老师模型
let teacModel = require('./model/teacherModel')
//判断数据的连接状态,若成功,CRUD
//判断数据的连接状态,若失败,报告错误
db(function(err){
if (err) console.log(err)
else{
//真正进行CRUD
stuModel.create({
stu_id:'002',
name:'小王八',
age:'24',
sex:'男',
hobby:['女','打代码','打游戏'], //限制爱好只能为数组,数组中的每一项必须为字符串
info:'一个二比一样的男子', //接收所有类型
},function(err,data){
if (!err) console.log(data)
else console.log(err)
})
}
})