第五章:MongoDB

第一节:关于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()

执行结果:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值