- 一、MongoDB的介绍和安装
- 1.介绍MongoDB
- 2.安装MongoDB
- 二、MongoDB的基本操作命令
- 1.MongoDB对库的操作
- 2.MongoDB对集合的基本操作
- 三、MongoDB对数据的增删改查
- 1.添加数据
- 2.更新数据
- 3.查询数据
- 4.删除数据
- 四、MongoDB中的一些常用方法
- 五、MongoDB 聚合函数
- 1.聚合框架中常用的几个管道操作
- 2.聚合操作练习
- 六、游标
- 七、MongoDB的导入导出
- 1.通用选项
- 2.导出文件
- 3.导入文件
- 4.二进制bson文件的导入和导出
- 八、Python操作MongoDB
MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。它支持的数据结构非常松散,是类似json的bson格式,因此可以存储比较复杂的数据类型。Mongo最大的特点是它支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引。
总结一下MongoDB的特点
- MongoDB 是一个文档存储的数据库,操作起来比较简单和容易。
- MongoDB安装简单。
- MongoDB支持多种编程语言:PYTHON,JAVA,C++,PHP,C#等多种语言。
- Mongo支持丰富的查询表达式。查询指令使用JSON形式的标记,可轻易查询文档中内嵌的对象及数组。
- MongoDB允许在服务端执行脚本,可以用Javascript编写某个函数,直接在服务端执行,也可以把函数的定义存储在服务端,下次直接调用即可。
MongoDB和传统的关系型数据库区别
- 传统数据库特点是存储结构化数据,数据以行为单位,每行的数据结构和类型相同
- MongoDB存储的是文档,每个文档得结构可以不相同
- MongoDB的集合不需要提前创建,可隐式创建,而关系型数据库的表需要提前定义
MongoDB和MySQL中字段的区别
接下来我们进入安装环节(安装包及可视化包下载地址):
https://pan.baidu.com/s/1lYpk5GuE2Fw991Y7OiIr7Q
提取码:6un6
开始安装:
1.指定安装路径
D:\MongoDB\Server\3.4
2.path中配置环境变量
D:\MongoDB\Server\3.4\bin
添加环境变量MONGO_HOME
变量名:MONGO_HOME
变量值:D:\MongoDB\Server\3.4
3.创建一个文件存放数据库的文件夹db和一个logs文件夹
D:\MongoDB\Server\3.4\data\db
D:\MongoDB\Server\3.4\data\logs
4.将MongoDB配置成一个服务
以管理员方式开启cmd并进入MongoDB的bin文件夹下,输入命令:
d:
cd D:\MongoDB\Server\3.4\bin
再运行配置服务的命令:
mongod --bind_ip 0.0.0.0 --logpath D:\MongoDB\Server\3.4\data\logs\mongo.log --logappend --dbpath D:\MongoDB\Server\3.4\data\db --port 27017 --serviceName "MongoDB" -serviceDisplayName "MongoDB" --install
5.启动服务
6.启动
-
开启服务器:
mongod --dpath 数据存放的文件夹
-
开启客户端:
mongodb://[用户名:密码@]主机地址1[:端口号] 默认不填写为链接本地 例如:使用用户名fred,密码foobar登录localhost的admin数据库 mongodb://fred:foobar@localhost
在这里我们输入以下命令开启
打开cmd,命令行启动
mongod --dbpath D:\MongoDB\Server\3.4\data\db
再打开一个cmd
mongod
MongoDB 中默认的数据库为 test,如果你没有创建新的数据库,集合将存放在 test 数据库中。
------------------创建数据库(数据库不存在为创建,存在即切换到指定数据库。)
use 库名
------------------查看当前所在的数据库
db
-----------------查看所有数据库(当创建库,但是库中没数据,则库不会被显示,除非插入数据)
show dbs
------------------删除数据库(先使用该库)
use 库名
db.dropDatabase()
2.MongoDB对集合的基本操作
进入指定库后,可以对集合(表)进行一些操作
1创建空集合
db.createCollection(集合名字, 可选参数)
可选参数:
- capped(可选,布尔类型):如果为 true,则创建固定集合。固定集合是指有着固定大小的集合,当达到最大值时,它会自动覆盖最早的文档。当该值为 true 时,必须指定 size 参数。
- size(可选,数值):为固定集合指定一个最大值,即字节数。如果 capped 为 true,也需要指定该字段。
- max(可选,数值):指定固定集合中包含文档的最大数量。
2.隐式创建集合
# 直接向不存在的集合插入数据,会自动创建集合
db.集合名字.insert({'name':'张三'})
3查看已有集合
show collections
或者
show tables
3.4删除集合
db.collection.drop() # 删除成功返回true
三、MongoDB对数据的增删改查
1.添加数据
①insertone()插入一条数据
db.集合名.insertone()
# 举例:
db.test.insertone( { item: "card", qty: 15 } );
② insertMany()插入多条数据
db.test.insertMany()
# 举例:
db.test.insertMany([
{ item: "card", qty: 15 },
{ item: "envelope", qty: 20 },
{ item: "stamps", qty:30 }
]);
③ insert()插入一条或者多条
db.集合名字.insert(数据)
# --------------------------------举例:插入一条数据
db.test.insert( { item : "card", qty : 15 })
db.test.find() # 先查看一下结果
{"_id":Objectlid("5bacac84bb5e8c5dff78dc21"), "item":"cardn, "qty":15 }
# -----------------------------举例:插入多条数据
db.test.insert(
[
{ _id: 11, item: "pencil", qty: 50, type: "no.2" },
{ item: "pen", qty: 20 },
{ item: "eraser", qty: 25 }
]
)
db.test.find()
{ "_id" : 11, "item" : "pencil", "qty" : 50, "type" : "no.2" }
{ "_id" : Objectld("5bacf31728b746e917e06b27"), "item" : "pen", "qty" : 20 }
{ "_id" : Objectld("5bacf31728b746e917e06b28"), "item" : "eraser", "qty" : 25 }
注意:
-
若插入的数据主键已经存在,则会抛
org.springframework.dao.DuplicateKeyException
异常,提示主键重复,不保存当前数据。 -
插入多条时候,有序插入命令
> db.test.insert([ {_id:10, item:"pen", price:"20" }, {_id:12, item:"redpen", price: "30" }, {_id:11, item:"bluepen", price: "40" } ], {ordered:true} )
在设置
ordered:true
时,插入的数据是有序的,如果存在某条待插入文档和集合的某文档 _id 相同的情况,_id 相同的文档与后续文档都将不再插入。在设置ordered:false
时,除了出错记录(包括 _id 重复)外其他的记录继续插入。
update函数参数说明:
db.collection.update(
, # update的查询条件,类似sql update查询内where后面的。
, # update的对象和一些更新的操作符(如$,$inc...)等,可以理解为sql update查询内set后面
{
upsert: ,# 可选参数,如果不存在update的记录,插入新对象,默认是false,不插入。
multi: , # 可选, 默认是false,只更新找到的第一条记录,true为按条件查找并全部更新
writeConcern: # 可选,抛出异常的级别。
}
)
2.1 set关键字
添加数据
> db.test2.insert({'name':'张三','age':12})
WriteResult({ "nInserted" : 1 })
使用set关键字,修改name为李四
> db.test2.update({'name':'张三'},{$set:{'name':'李四'}})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
# 查询该条数据,成功修改
> db.test2.find()
{ "_id" : ObjectId("5f645e811e1dd14f99674e07"), "name" : "李四", "age" : 12 }
倘若不加set,修改李四名字为王五
> db.test2.update({'name':'李四'},{'name':'王五'})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
查询所有数据,发现没有{‘name’:王五’,‘age’:12}的数据,只有{‘name’:王五’},说明不加入set不是修改,而是替换
> db.test2.find()
{ "_id" : ObjectId("5f645e811e1dd14f99674e07"), "name" : "王五" }
2.2 unset关键字
添加数据
> db.test2.insert({'name':'张三','age':12})
WriteResult({ "nInserted" : 1 })
使用unset关键字,name字段
> db.test2.update({'name':'张三'},{$unset:{'name':'张三'}})
# 查询该数据,成功删除name字段
> db.test2.find()
{ "_id" : ObjectId("5f6460e41e1dd14f99674e08"), "age" : 12 }
2.3 rename关键字
原始数据
> db.test2.find()
{ "_id" : ObjectId("5f6460e41e1dd14f99674e08"), "age" : 12 }
使用rename,将age字段修改为num
> db.test2.update({'age':12},{$rename:{'age':'num'}})
# 成功修改字段
> db.test2.find()
{ "_id" : ObjectId("5f6460e41e1dd14f99674e08"), "num" : 12 }
2.4 inc关键字
原始数据
> db.test2.find()
{ "_id" : ObjectId("5f6460e41e1dd14f99674e08"), "num" : 12 }
使用inc关键字,可以增加一个字段
> db.test2.update({'num':12},{$inc:{'sex':1}})
# 成功添加字段
> db.test2.find()
{ "_id" : ObjectId("5f6460e41e1dd14f99674e08"), "num" : 12, "sex" : 1 }
2.5 其他可选参数
multi修改多条,修改name为张三的所有人的年龄为21
db.user.update({'name':'张三'},{$set:{'age': 21}},{multi:true})
upsert查询到数据则修改,查询不到则将数据添加,但是注意查询条件不会被添加到数据字段
db.stu.update({'name':'zs'},{$set:{'name':'ls'}},{upsert:true});
# 如果name为zs的数据不存在,则会自动添加一条{'name':'ls'}的数据
3.查询数据
基本函数
db.集合名.find(查询条件)
# 将查询的数据格式化展示
db.集合名.find(查询条件).pretty()
3.1 条件操作符语法
操作格式范例sql中的类似语句={:
}db.col.find({"by":"菜鸟教程"}).pretty()
where by = '菜鸟教程'
<{:{$lt:}}
db.col.find({"likes":{$lt:50}}).pretty()
where likes < 50
<={:{$lte:}}
db.col.find({"likes":{$lte:50}}).pretty()
where likes 50
>={:{$gte:}}
db.col.find({"likes":{$gte:50}}).pretty()
where likes >= 50
!={:{$ne:}}
db.col.find({"likes":{$ne:50}}).pretty()
where likes != 50
3.2 逻辑查询语法
and语法:符合多个条件
db.集合名.find({查询条件1},{查询条件2},{查询条件3}...)
或者
db.集合名.find({$and:[{查询条件1},{查询条件2}]})
or语法:符合条件1或符合条件2
db.集合名.find({$or:[{查询条件1},{查询条件2}]})
nin语法:不符合数值1或数值2的
db.集合名.find({字段名:{$nin:[值1,值2,值3...]}})
3.3 查询示例
要求代码查看所有db.stu.find()查看name=zsdb.stu.find({‘name’:‘zs’})查看name!=zs的db.stu.find({‘name’:{$ne:‘zs’}})查看name=zs并且age=12db.stu.find({‘name’:‘zs’},{‘age’:12})年龄不在15,16,17的都显示db.stu.find({‘age’:{$nin:[15,16,17]}})年龄在15,16,17的都显示db.stu.find({‘age’:{$in:[15,16,17]}})存在age字段的都显示db.stu.find({‘age’:{$exists:1}})不存在age字段的都显示db.stu.find({‘age’:{$exists:0}})查询年龄=30岁的数据db.stu.find({age:30})查询年龄>30岁的数据db.stu.find({age:{$gt:30}})查询年龄>=30岁的数据db.stu.find({age:{$gte:30}})查询年龄最近更新
- 深拷贝和浅拷贝的区别(重点)
- 【Vue】走进Vue框架世界
- 【云服务器】项目部署—搭建网站—vue电商后台管理系统
- 【React介绍】 一文带你深入React
- 【React】React组件实例的三大属性之state,props,refs(你学废了吗)
- 【脚手架VueCLI】从零开始,创建一个VUE项目
- 【React】深入理解React组件生命周期----图文详解(含代码)
- 【React】DOM的Diffing算法是什么?以及DOM中key的作用----经典面试题
- 【React】1_使用React脚手架创建项目步骤--------详解(含项目结构说明)
- 【React】2_如何使用react脚手架写一个简单的页面?