mongodb
介绍
Mongodb是一个介于关系数据库和非关系数据库之间的产品(Nosql),是非关系数据库当中功能最丰富,最像关系数据库的(在学习的时候有一种在学mysql的感觉),语法有点类似javascript面向对象的查询语言(又有一种在学习JavaScript的感觉),它是一个面向集合的,模式自由的文档型数据库。Mongodb数据库旨在为 WEB 应用提供可扩展的高性能数据存储解决方案。
- MongoDB是一个数据库
- 操作语法有点像JavaScript的面向对象写法
命令行操作
基本操作
- 打开cmd在命令行中输入命令:
此命令就是运行1_client.bat的执行效果
mongo
- 退出mongoDB使用
exit
exit
- 查看所有的数据库列表:
在MySQL中,查询数据库信息是
show databases
列出的库都是非空的库
show dbs
- 创建数据库或切换数据库:
use切换数据库时,若库存在则切换,如果数据库不存在则创建并切换
use创建的数据库只是一个空的数据库,没有集合,所以
show dbs
不显示空数据库。
use 数据库名
可以使用db
命令来查看当前所在的数据库名称:
db
- 给数据库中创建一个members的集合,并向集合中添加文档(行)数据:
表是不需要先行进行定义的,当我们往一个表中插入记录后,表就自动出来了。
JSON格式数据:不是严格意义上的json数据,key名可以不使用引号包裹
db.表名/集合名.insert(JSON格式数据)
# 表名/集合名是不存在的(第一次插入数据的时候),当数据插入完毕则表名就存在了
- 查看当前数据库中的集合列表:
# 查看当前数据库中的集合列表
show tables
# 或
show collections
- 删除表
db.表名/集合名.drop()
- 删除库
需要进入要删除的库,然后再去执行这个命令
# 删除的是当前的库
db.dropDatabase()
刚才命令集合:
- show dbs:查看数据库列表
- use db:使用/创建数据库
- db:查看当前库名
- db.表名.insert():新增数据&可能会创建出一个数据表
- show tables / show collections:查看当前库中的表列表
- db.表名.drop():删除指定的表
- db.dropDatabase():删除当前的库
增删改查
增
# 添加单条文档数据
db.表名/集合名.insertOne({ key: value , key: value...})
# 添加多条文档数据
db.表名/集合名.insertMany([{}, {}, {}])
# 可以添加单条也可以多条数据(为主)
db.表名/集合名.insert( {} )
db.表名/集合名.insert([{}, {} ])
查
- 查询所有的数据
类似于原生的SQL:select * from table [where xxx]
db.表名/集合名.find(); # 获取全部(推荐)
db.表名/集合名.find({}); # 获取全部
{ }
用于条件限制,当没条件的时候,上述两个用法效果一致
关于
_id
{ “_id” : ObjectId(“5c0fa4758878caa23d36c0fb”), “name” : “zhangsan” }
objectID类型
ObjectId对象对象数据组成:时间戳 |机器码|PID|计数器 系统自动生成
_id的键值我们可以自己输入,但是不能重复,因此为了避免工作的复杂建议不要人为的去干预_id的是很工程
- 带条件查询
类似于MySQL的
where
语句此处允许使用多个条件,如果有就在"{}"中多写几个,默认是“且”条件关系。
db.表名/集合名.find({key:value,key:value....})
- 字段显示控制
类似于MySQL的
select
后的字段选择,selectusername,password
from members
db.表名/集合名.find(条件,{字段名:0或1,....})
# 0:不显示
# 1:显示
# _id字段,由于其是系统产生的,默认情况下是显示的
- 逻辑运算(稍微复杂一些)
### 条件表达式
# 年龄大于5的
db.表名/集合名.find({age:{$gt:5}}); #age > 5(great than)
# 年龄大于等于5的
db.表名/集合名.find({age:{$gte:5}}); #age >= 5 (great than & equal)
# 年龄小于5的
db.表名/集合名.find({age:{$lt:5}}); #age < 5 (less than)
# 年龄小于等于5的
db.表名/集合名.find({age:{$lte:5}}); #age <= 5
# 年龄不等于5的
db.表名/集合名.find({age:{$ne:5}}); #age != 5 (not equal)
# 在一个指定的数值中查询 $in 年龄在不在这几个指定数值当中
db.表名/集合名.find({age:{$in:[1,2,3]}) ## where xxx in '集合'
## 且关系 and
db.表名/集合名.find({age:{$lt:5},username:"user11"})
## where age < 5 & username = 'user11'
## 或关系 or(有点绕)
db.表名/集合名.find({$or:[{条件1},{条件2}]})
## 例如
db.表名/集合名.find({$or:[{age:{$ne:5}},{username: "user11"}]});
需求:查询出年龄小于30或者gender为0的数据
db.members.find({$or:[{age:{$lt:30}},{gender:0}]})
- 模糊查询
类似于原生的SQL语句:
where xxxx like '%YYY%'
#正则
db.表名/集合名.find({字段名:/正则/i})
# i 不区分大小写
# `不能加引号`,否则就成了字符串,成了字符串就成了精确匹配
- 统计
类似于MySQL中的
select count(id) from table
计数操作:数记录的数量
#统计总记录数
db.表名/集合名.count(); // 统计所有的记录的总数
db.表名/集合名.find({}).count(); // 统计符合条件的结果的记录总数
注意点:find()顺序是否可以与count()颠倒。
count不能与find的顺序交换
- 排序
# 排序
# 1 升序 -1 降序 字段
# 以age字段来升序
db.表名/集合名.find().sort({age:1})
# 以age字段来降序
db.表名/集合名.find().sort({age:-1})
- 分页(实用)
原生的SQL中:
- select * from table where id > 50
limit 0,10
- select * from table where id > 50
limit 10
# 指定获取几条 skip/limit 分页
db.表名/集合名.find().limit(3);
db.表名/集合名.find().skip(1).limit(3);
## skip表示起始位置,也就是从第几个开始
## limit表示获取的记录的个数(长度)
## skip与limit的顺序先后无所谓
改
# 更新是要有条件的,没有条件在数据库层面来讲是可以更新的,但是实际是没有对应的业务需求
# 只修改单条文档
db.表名/集合名.updateOne({key:value},{$set:{key:value}})
# 修改符合条件所有文档数据
db.表名/集合名.updateMany({key:value},{$set:{key:value}})
## 如果上述两个方法的条件一致,并且有多个符合条件的,那么:
# updateOne,不管有多少个符合条件的只修改第一个
# updateMany,有多少改多少
# 字段的值的`自增和自减`
db.表名/集合名.updateOne({key:value},{$inc:{key:1}}) // increments,自增
db.表名/集合名.updateMany({key:value},{$inc:{key:1}})
db.表名/集合名.updateOne({key:value},{$inc:{key:-1}}) // decrements
db.表名/集合名.updateMany({key:value},{$inc:{key:-1}})
# 自增是整数,自减是负数
# 更新和删除操作允许不写条件,但是不能不写
删
删除在实际开发的时候一般不用,正常做程序开发的时候所使用的删除实际上是修改。
删除分为:真删除(物理删除)、假删除(逻辑删除)。
删除集合中已存在的文档数据:
# 删除单条文档
db.表名/集合名.deleteOne({ key: value })
# 删除符合条件多条文档
db.表名/集合名.deleteMany({key: value})
# 删除全部数据(慎用)
db.表名/集合名.deleteMany({})
nodejs中操作
通过第三方插件mongoose连接操作,mongoose是Node环境下异步操作mongodb数据库的扩展,仅限于Node环境下使用。
官网:http://www.mongoosejs.net/docs/index.html
下载安装:
# 安装mongoose
npm i -S mongoose
导入和配置:
// 导入模块
const mongoose = require('mongoose')
// 连接数据库 返回promise对象
mongoose.connect('mongodb://localhost:27017/数据库名', {
useNewUrlParser: true,
useUnifiedTopology: true
})
// 库必须要先存在
// connect方法参2在新版本需添加,否则会有警告提示
// useNewUrlParser:当前URL字符串分析器已弃用,将在将来的版本中删除。要使用新的解析器,请将选项{usenewurlparser:true}传递给mongoclient.connect。
// useUnifiedTopology:当前服务器发现和监视引擎已弃用,将在将来的版本中删除。要使用新的服务器发现和监视引擎,请将选项{useUnifiedTopology:true}传递给mongoclient构造函数
定义Schema:
Schema是mongoose中会用到的一种数据模式,可以理解为数据表结构的定义;每个schema会映射到mongodb中的一个集合,它不具备操作数据库的能力。Schema中定义数据校验,默认值,字段名,字段类型等特性。
作用:
- 建表(也就是说,后期建表不再通过mongoDB的命令行的形式产生了,而是通过JavaScript代码实现)
在定义schema的是有使用到相关约束规则,可以查看:http://www.mongoosejs.net/docs/guide.html
// 创建用户集合规则
const UserSchema = new mongoose.Schema({
// 字段名/域名称
name: {
// 指字域类型
type: String,
// 必填字段
required: true,
// 字段最小长度 minlength 用于字符串类型
minlength: 2,
},
age: {
type: Number,
// 默认值
default: 10,
// 字段最小值 min用于数字类型
min: 1,
},
pwd: String,
email: String,
// 定义此字段为 字符串数组类型
hobbies: [String],
});
在Schema定义好后,后期增删改查时,如果对应的表不存在,则其会自动按照Schema的约束进行建表,如果表存在了则不重新建立。
定义model:
model 是由schema 生成的模型,模型是最终用来进行数据增删改查操作使用的,可以对数据库的操作:
// 参数1:model名称,模型名一般会和表名一样
// 参数2:schema名称
// 参数3:操作的数据集合(表名) 如果参数3没有填写则以 参1的复数形式为操作数据集合名称
const Model = mongoose.model('User', UserSchema, 'users')
// 模型curd相关方法
Model.insertMany({key:value})
Model.deleteMany({条件},err=>{})
Model.deleteOne({条件},err=>{})
Model.countDocuments({条件})
Model.find({条件},{可选字段返回:0/1},{skip:0,limit:10})
Model.findOne({条件},{可选字段返回:0/1})
Model.updateMany({条件},{$set:{key:value}},res=>{})
Model.updateOne({条件},{$set:{key:value}},res=>{})
:
// 参数1:model名称,模型名一般会和表名一样
// 参数2:schema名称
// 参数3:操作的数据集合(表名) 如果参数3没有填写则以 参1的复数形式为操作数据集合名称
const Model = mongoose.model('User', UserSchema, 'users')
// 模型curd相关方法
Model.insertMany({key:value})
Model.deleteMany({条件},err=>{})
Model.deleteOne({条件},err=>{})
Model.countDocuments({条件})
Model.find({条件},{可选字段返回:0/1},{skip:0,limit:10})
Model.findOne({条件},{可选字段返回:0/1})
Model.updateMany({条件},{$set:{key:value}},res=>{})
Model.updateOne({条件},{$set:{key:value}},res=>{})