文章目录
第一节:关于MongoDB
MongoDB简介
MongoDB是比较流行的基于文件存储的非关系型数据库,使用C++编写;
可以存储任意格式的BSON(很类似JSON)数据;
拥有非关系型数据库的便捷、高效,同时也支持较为复杂的关系查询;
【数据库、集合、文档的概念】
关系型数据库中的数据库,MongoDB中也叫数据库
;
关系型数据库中的表,MongoDB中称为集合
;
关系型数据库中的行或记录,MongoDB中叫做文档
;
MongoDB的安装
MongoDB官网下载地址点击此处:
可视化工具MongoChef下载地址点击此处:
【安装过程说明】
MongoDB和它的可视化工具安装比较简单,使用默认的配置进行安装即可,安装路径中不要含有中文;
如果后续遇到服务不能正常运行的问题,请使用管理员命令行执行安装程序;
为了后续方便,可以选择将MongoDB安装路径的bin目录添加到系统的Path环境变量;
安装校验
1、在任意位置创建数据库文件存储路径,例如:D:\mogo
2、打开命令行终端,进入MongoDB安装路径的bin目录下,默认为:C:\Program Files\MongoDB\Server\3.4\bin
3、命令行运行如下命令,开启MongoDB服务,注意把路径换成自己的数据库存储路径:
mongod --dbpath=D:\mogo
此时窗口输出运行信息,注意到MongoDB的端口是
27017
,最终程序阻塞在原地,这代表服务已经正常运行了:
例:
4、打开新的命令窗口,在命令行中启动MongoDB应用程序,前提是把MongoDB安装路径的bin目录已加入到环境变量
mongo.exe
5、查看现有数据库
show dbs
注意:admin和local是系统自带的两个数据库
例:
第二节:MongoDB的基本操作
数据库操作
1、开启MongoDB服务
mongod --dbpath=setpath
2、启动MongoDB数据库
mongo
3、查看所有数据库
show dbs
4、创建 / 切换数据库(不存在时创建,但只有插入集合后才会显示)
use mydb
5、显示当前数据库名
db
db.getName()
6、查看帮助
help
7、退出MongoDB
exit
8、删除数据库
db.dropDatabase()
集合操作
1、显示所有集合
show collections
2、创建新的集合
db.createCollection("xxx")
3、删除集合
db.xxx.drop()
文档操作(增删改查)
- 增加文档
1、插入一个文档
db.xxxx.insert(
{key1:value1,key2:value2,key3:value3}
)
2、插入多个文档
db.xxxx.insert([
{key1:value1,key2:value2,key3:value3},
{key4:value4,key5:value5,key6:value6}
])
3、没有指定文档的id时,save的功能和insert一致
db.xxxx.save(
{key1:value1,key2:value2,key3:value3}
)
db.xxxx.save([
{key1:value1,key2:value2,key3:value3},
{key4:value4,key5:value5,key6:value6}
])
- 删除文档
1、删除指定条件的文档
# {"justOne":1}只删除一个,为0时代表所有符合条件的全删除
db.xxxx.remove({key1:value1},{"justOne":1})
- 修改文档
1、修改value
db.xxxx.update(
{key1:value1},
{$set:{key1:value2}}
)
2、修改key1为value1的文档的key2,增加10
db.xxxx.update(
{key1:value1},
{$inc:{key2:10}}
)
3、key1为0的,修改为18,作用于全部文档
db.xxxx.update(
{key1:0},
{$set:{key1:18}},
{"multi":1}
)
- 查询文档
1、查询所有
db.xxxx.find()
2、查询key1为0的文档,显示key2和key3
db.xxxx.find(
{key1:0},
{key2:1,key3:1}
)
3、查询key1为0的文档,显示key2以外的所有字段
db.xxxx.find(
{key1:0},
{key2:0}
)
4、查询一条key1为0的文档,显示key2以外的所有字段
db.xxxx.findOne(
{key1:0},
{key2:0}
)
MongoDB中的比较运算
$gt
—— 大于
$gte
—— 大于等于
$lt
—— 小于
$lte
—— 小于等于
$eq
—— 等于
$ne
—— 不等于
例:
# 查询年龄大于10的文档
db.xxxx.find( {"age":{$gt:10}} )
# 查询年龄大于等于10的文档
db.xxxx.find( {"age":{$gte:10}} )
# 查询年龄小于10的文档
db.xxxx.find( {"age":{$lt:10}} )
# 查询年龄小于等于10的文档
db.xxxx.find( {"age":{$lte:10}} )
# 查询年龄等于10的文档
db.xxxx.find( {"age":{$eq:10}} )
# 查询年龄不等于10的文档
db.xxxx.find( {"age":{$ne:10}} )
条件’与’,条件’或’
# 18以上成年男子文档(条件与)
db.xxxx.find( {"age":{$gte:18},"gender":1} )
# 年龄在30到50之间的文档
db.xxxx.find( { "age":{'$gt':30,'$lt':50} } )
# 60以上或10岁以下文档(条件或)
db.xxxx.find( {$or:[ {"age":{$gte:60}}, {"age":{$lte:10}} ]} )
# 查询成年男子或老幼(与或结合使用)
db.xxxx.find(
{$or:[ {"age":{$gte:18},"gender":1},
{$or:[{"age":{$gte:60}},{"age":{$lte:10}}]} ]}
)
第三节:查询结果的加工
使用 pretty() 格式化地显示数据
db.xxxx.find().pretty()
更多查询结果的加工
1、降序与升序(1为升序)
db.xxxx.find().sort({key:-1})
2、统计条数
db.xxxx.find().count()
3、取前 n 个数据
db.xxxx.find().limit(n)
4、跳过前 n 个 数据
db.xxxx.find().skip(n)
获取分页数据
所谓分页,无非是查询结果后,跳过一些数据,再取固定数据。
例:每页10条数据,那么第3页的数据如下
db.xxxx.find().skip(20).limit(10)
第四节:Python与MongoDB的交互
安装依赖 pymongo
和MySQL一样,用户要用到MongoDB,也是需要动态地进行数据库操作,因此需要编程语言动态实现。Python与MongoDB的交互也是需要一个第三方类库——pymongo实现;
pip3 install pymongo
Python与MongoDB的交互过程
1、建立Python到MongoDB的连接;
2、指定要访问的数据库和集合;
3、通过集合执行MongoDB指令;
4、结果的二次处理与输出;
5、断开连接;
这里以本机mydb数据库中heros集合中的文档为例
例1:插入数据
import pymongo
# 连接MongoDB数据库
conn = pymongo.MongoClient(
# 配置主机和端口
host="localhost", port=27017
)
# 指定要操作的数据库名
db = conn.mydb
# 指定要操作的集合名
collection = db.heros
# 插入一个数据文档
collection.insert(
{"name": "张真人", "age": 120, "gender": 1, "words": "太极那么高深的功夫,你们居然当早操练?"}
)
# 插入多个数据文档
collection.insert([
{"name": "东方不败", "age": 40, "gender": 3, "words": "没有了性,练功容易多了"},
{"name": "段公子", "age": 19, "gender": 1, "words": "你信吗?我能征服每一个女人"},
{"name": "神仙姐姐", "age": 18, "gender": 0, "words": "大家都叫我女神"}
])
print("插入成功!")
# 关闭连接
conn.close()
执行结果:
例2:查询数据
import pymongo
# 创建连接
conn = pymongo.MongoClient(
host="127.0.0.1", port=27017
)
# 指定要操作的数据库与集合
db = conn.mydb
collection = db.heros
# 查询文档个数
ret1 = collection.find().count()
print('文档个数:',ret1)
# 查询全部
ret2 = collection.find()
print('查询后的文档内容:',ret2)
print('查询后的文档类型:',type(ret2))
# 查询年龄大于100的数据
ret3 = collection.find(
{"age": {"$gt": 100}}
)
# 查询年龄小于18且性别是女的
ret4 = collection.find(
{
"age": {"$gt": 18},
"gender": 0
}
)
# 查询年龄大于100的,或20岁以下的女性
ret5 = collection.find(
{
"$or": [
{"age": {"$gt": 100}},
{"age": {"$lt": 20}, "gender": 0}
]
}
)
# 查询结果按姓名降序排列
ret6 = collection.find().sort("name", pymongo.ASCENDING)
# 取前3个文档
ret7 = collection.find().limit(3)
# 查询第二页的三个文档,并遍历出来
ret = collection.find().skip(3).limit(3)
for item in ret:
print(type(item), item)
# 断开连接
conn.close()
执行结果:
例3:修改数据
import pymongo
# 建立数据库连接
conn = pymongo.MongoClient(
host="127.0.0.1", port=27017
)
# 指定数据库与集合
db = conn.mydb
collection = db.heros
# 执行更新:查询姓名为张真人的文档,姓名修改为"张三疯",年龄减10岁
ret = collection.update(
{"name": "张真人"},
{
"$set": {"name": "张三疯"},
"$inc": {"age": -10}
}
)
print(ret)
# 断开连接
conn.close()
执行结果:
例4:删除数据
import pymongo
# 建立与MongoDB的连接
conn = pymongo.MongoClient(
host="127.0.0.1", port=27017
)
# 指定数据库与集合
db = conn.mydb
collection = db.heros
# 移除文档:移除年龄在40以下的文档数据
ret = collection.remove(
{"age": {"$lt": 40}}
)
print(ret)
# 断开连接
conn.close()
执行结果: