PyMongo和MongoDB数据库的交互 常用操作方法

鳄鱼君

发表文章数:642

Vieu四代商业主题

高扩展、安全、稳定、响应式布局多功能模板。

¥69 现在购买
首页 » Python » PyMongo和MongoDB数据库的交互 常用操作方法

Python和mongodb数据库交互,基本语法都差不多,只要你知道mongodb的语法,那么在Python中使用就不会很难。先来看一下整体的框架图:

PyMongo和MongoDB数据库的交互 常用操作方法

在MongoDB中,常用的操作有添加文档、更新文档、删除文档和查询文档。文档的数据结构和JSON基本一样。所有存储在集合中的数据都是BSON格式。BSON是一种类似JSON的二进制形式存储格式,简称Binary JSON。

初始化数据库连接,需要使用 MongoClient 对象,并且指定连接的 URL 地址和要创建的数据库名。MongoDB 中默认的数据库为 test,如果你没有创建新的数据库,集合将存放在 test 数据库中。

添加文档

MongoDB的插入操作需要使用insert_one(参数)或者insert_many(参数),插入的参数就是Python的字典,前者为单条添加,后者为批量添加:

import  pymongo
import datetime
import re
# 创建连接对象
client=pymongo.MongoClient()
# 第一种方式
# 连接DB数据库
db=client['DB']
# 连接集合user,集合类似关系数据库的数据表
# 如果集合不存在,就会新建集合user
user_collection=db.user

# 第二种方式
# database=client.DB #创建数据库名字
# collection=database.user #集合的名字

# database= client['DB']#创建数据库名字
# collection = database['user']#集合的名字
# 设置文档格式
user_info={
    '_id':250,
    'author':'小贱',
    'text':'无无敌的我迷路了',
    'tags':['小贱贱','爱运动','长得帅'],
    'data':datetime.datetime.utcnow()
}
# 使用insert_one单条添加文档,inserted_id获取写入后的id
# 添加文档时,如果文档包含'_id'键,就会自动添加'_id','_id'在集合中是唯一的
# inserted_id用户获取添加后的id
user_id=user_collection.insert_one(user_info).inserted_id
print('user_id is ',user_id)

# 批量添加
user_infos=[
    {
        '_id': 618,
        'author': '贱',
        'text': '无无敌的我迷路了',
        'tags': ['小贱贱', '爱运动', '长得帅'],
        'data': datetime.datetime.utcnow()
    },
    {
        '_id':518,
        'author':'贱',
        'text':'无无敌的我迷路了',
        'tags':['小贱贱','爱运动','长得帅'],
        'data':datetime.datetime.utcnow()
    },
    {
        '_id':238,
        'author':'人',
        'text':'无无敌的我迷路了',
        'tags':['小贱贱','爱运动','长得帅'],
        'data':datetime.datetime.utcnow()
    },
]
# inserted_ids用户获取添加后的id
user_ids=user_collection.insert_many(user_infos).inserted_ids
print('user_ids is ',user_ids)

代码实现了单条添加批量添加,单条添加的数据是user_info,该数据是一个字典数据结构;批量添加的数据是uesr_infos,该数据是一个字典数据组成的列表。执行数据添加分别由insert_one和insert_many方法实现。数据添加完成后,使用inserted_id和inserted_ids可返回添加后所自动生成的id内容。

更新文档

更新可以使用update_one(参数1,参数2)update_many(参数1,参数2),那么很容易理解了,前者为单条更新,后者为批量更新,参数都是字典,且不能省略。参数1用来寻找要更新的记录,参数2用来更新记录的内容。

文档更新需要加入操作符。操作符的作用:通常文档只会有一部分要更新,利用原子的更新修改器可以使得这部分更新极为高效。

MongoDB提供了许多原子操作,比如文档的保存、修改、删除等。所谓原子操作,就是要么将这个文档保存到MongoDB,要么没有保存到MongoDB,不会出现查询到的文档没有保存完整的情况。更新修改器是一种特殊的键,用来指定复杂的更新操作,比如调整、增加或者删除键,还可能用于操作数组或者内嵌文档。

下面介绍常用的更新操作符
● $set:用来指定一个键的值。如果这个键不存在,就创建它;如果存在,就执行更新。
● $unset:从文档中移除指定的键。
● $inc:修改器用来增加已有键的值,或者在键不存在时创建一个键。$inc就是专门来增加(和减少)数字的,只能用于整数、长整数或双精度浮点数。要是用在其他类型的数据上,就会导致操作失败。
● $rename:操作符可以重命名字段名称,新的字段名称不能和文档中现有的字段名相同。如果文档中存在A、B字段,将B字段重命名为A,$rename会将A字段和值移除掉,然后将B字段名改为A。
● $push:如果指定的键已经存在,就会向已有的数组末尾加入一个元素;如果指定的键不存在,就会创建一个新的数组。

例如随便更新已添加的文档,这里只介绍具体的使用方法,其它同理:

# update(筛选条件,更新内容) 筛选条件为空,默认更新第一条文档
user_collection.update_one({'age':18},{'$set':{'name':'我更新了名字'} }) #将年龄为18岁的人的名字改为 xxx
user_collection.update_many({'age':18},{'$set':{'salary':520} } ) #将所有年龄为18岁的人的工资改为520

同样我们也可以使用逻辑参数,这里自己尝试,不再做详细介绍了。

查询文档

MongoDB的查找功能可以使用find(查询条件,返回字段)find_one(查询条件,返回字段),两个参数的类型均为Python字典,参数可以省略。前者返回多个,后者只返回一个,find()方法比较常用一点!

# 查询文档,find{'_id':250},其中{'_id':250}为查询条件
# 若查询条件为空,则默认查询全部
find_value=user_collection.find({'_id':250})
# print(list(find_value))

content_three=collection.find({'name':'qyl'},{'_id':0})
data=[]
for item in content:
    data.append(item)
print(data)

我们查找的都是一些可迭代对象,可以通过列表推导式让它更加直观的显示出来,我是比较捞的,用了for循环。find()中如果带有两个参数,第二个参数也是一个字典,Key就是字段的名称,1表示返回这个字段,0表示不返回这个字段。

如果要实现多条件查询,就需要使用查询操作符:$and和$or,代码参考:

# and条件查询
find_value=user_collection.find(
    {"$and":[{"_id":250},{"author":"小贱"}] }
)
print(list(find_value))

# or条件查询
find_value=user_collection.find(
    {"$or":[{"_id":250},{"author":"小贱"}] }
)
print(list(find_value))

方法find()传递字典作为查询条件,操作符$and和$or作为字典的键,字典的值是列表格式的,列表中的元素以字典形式表示,一个元素代表一个查询条件。

如果要实现大于、小于或者不等于这类比较查询,就需要使用比较查询操作符:$lt(小于)、$lte(小于或等于)、$gt(大于)、$gte(大于或等于)、$ne(不等于)、$in(in,符合范围内)、$nin(not in,范围之外),使用方法如下:

content=collection.find({'age':{'$gt':2} }) #查询所有age大于2的人
content_two=collection.find( { 'age': {'$gte':17,'$lte':20} } ) #查询所有age大于等于17小于等于20的人
content_three=collection.find({ 'salary': {'$ne':2 } }) #查询所有salary不等于2的人
data=[]
for item in content:
    data.append(item)
print(data)

比较查询多条件查询存在明显的差别:
(1)多条件查询以操作符为字典的键,比较查询以字段为字典的键
(2)多条件查询的值是列表格式的,比较查询的值是字典格式的

如果使用两者组成一个查询,代码如下:

find_value=user_collection.find(
    {"$and":[{"_id":{"$gt":100,"$lt":300},{"_id":{"$in":[250,150]}}] }
)
print(list(find_value))

可以发现,多条件查询操作符$and作为最外层字典的键,比较查询操作符位于最里层字典。$and是将每个条件连接起来,主要作用于每个查询条件之间;比较查询操作符($gt和$in)使条件按照某个规则成立条件判断,主要作用于每个查询条件里面。

当查询条件不明确某个值的时候,可以使用模糊匹配进行查询。在MongoDB中实现模糊匹配需要引用正则表达式,代码如下:

# 模糊查询需要借助正则表达式实现
# 方法一
find_value=user_collection.find(
    "author":{"$regex":".*小.*"}
)
print(list(find_value))

# 方法二
import re
regex=re.compile(".*小.*")
find_value=user_collection.find(
    "author":regex
)
print(list(find_value))

实现模糊匹配有两种不同的方式,两者都需要引用正则表达式来完成模糊功能:
方法一:使用操作符$regex作为字典的键,告诉数据库这个查询语句要查找字段author中含有“小”的内容。
方法二:re.compile定义了一个Pattern实例,这是正则表达式对象,将其实例作为查询条件的值,同样也是告诉数据库需要查找字段author中含有“小”的内容。

我们知道JSON可以嵌套多个JSON, MongoDB的文档也是如此。当查询文档中某个字段嵌套多个文档时,将嵌套里面的文档作为查询条件实现文档查询,代码如下:

# 查询字段"tags":['小贱贱', '爱运动', '长得帅']
find_value=user_collention.find(
    {"tags":"小贱贱"}
)
print(list(find_value))
# 查询字段"tags":{"db":"Mongodb","abc":"yuy"}
# 查询件套字段,只需查询嵌套里面的某个值即可
find_value=user_collection.find(
    {"tags.db":"Mongodb"}
)
print(list(find_value))

# 查询字段"tags":{"db":{"Mongodb":"mysql","e1yu":"com"},"abc":"yuy"}
# 查询件套字段,只需查询嵌套里面的某个值即可
find_value=user_collection.find(
    {"tags.db.Mongodb":"mysql"}
)
print(list(find_value))

字段tags的值是一个字典类型的数据,也就是说,文档中tags字段的值嵌套了另一个文档,如果查询条件是“db”:“Mongodb”,而“db”属于字段tags,可通过“tags.db”对其进行定位。

对查询结果排序

MongoDB支持对查询到的结果进行排序。具体方法为sort(),跟前面学的那个数据类型排序差不多,名字都一样,它是对查询到的结果进行排序的,所以要和find()方法结合使用:

content=collection.find({'age':{'$gt':2} }).sort('age',-1) #查询所有age大于2的人
content_one=collection.find({ 'salary': {'$ne':2 } }).sort('age',1) #查询所有salary不等于2的人
data=[]
for item in content:
    data.append(item)
print(data)

sort()方法接收两个参数:第一个参数指明需要以哪一项进行排序;第二个参数-1表示降序1表示升序,代码的运行结果自己尝试哟….

删除记录

删除可以使用delete_one(参数)delete_many(参数),这里的参数还是字典,delete_one()方法只删除一条记录,delete_many()删除所有符合要求的记录。

from pymongo import MongoClient

client=MongoClient('mongodb://localhost:27017')
database=client.Chapter6 #创建数据库名字
collection=database.spider #集合的名字
data=[{'id':1,'name':'zjj','age':18,'salary':12000},
      {'id':2,'name':'wff','age':20,'salary':23400},
      {'id':3,'name':'xxk','age':30,'salary':99999},
      {'id':4,'name':'qyl','age':12,'salary':3000}]
collection.delete_one({'name':'zjj'}) #删除第一个名字叫做zjj的人
collection.delete_many({'name':'zjj'}) #删除所有名字叫做zjj的人

对查询结果去重

去重使用distinct()方法,该方法返回一个去重后的列表。

content=collection.distinct('age') #参数为去重的对象,只要age有重复,就会过滤掉
data=[]
for item in content:
    data.append(item)
print(content)

判断数据库是否已存在

我们可以读取 MongoDB 中的所有数据库,并判断指定的数据库是否存在:

import pymongo
 
myclient = pymongo.MongoClient('mongodb://localhost:27017/')
 
dblist = myclient.list_database_names()
# dblist = myclient.database_names() 
if "runoobdb" in dblist:
  print("数据库已存在!")

判断集合是否已存在

我们可以读取 MongoDB 数据库中的所有集合,并判断指定的集合是否存在:

import pymongo
 
myclient = pymongo.MongoClient('mongodb://localhost:27017/')
 
mydb = myclient['runoobdb']
 
collist = mydb. list_collection_names()
# collist = mydb.collection_names()
if "sites" in collist:   # 判断 sites 集合是否存在
  print("集合已存在!")

注意:collection_names 在最新版本的 Python 中已废弃,Python3.7+ 之后的版本改为了 list_collection_names()。

Robo 3T执行MongoDB命令

我们可以使用PyMongo命令来操作数据库,同样也可以使用Robo 3T来操作数据库,其实绝大数命令都是相同的,只是为了让得到的数据更加直观而已。

PyMongo和MongoDB数据库的交互 常用操作方法

我要查询所有age大于等于18的人,只需要修改find()参数即可,按照上面图片自己再练习一下,也可以使用distinct()函数实现去重,也可以使用sort()来排序,这里需要注意的是,这里sort()方法接收的是一个字典,字典的Key为将要排序的项,Value为1或者-1.同样update()和remove()使用方法一样。

未经允许不得转载:作者:鳄鱼君, 转载或复制请以 超链接形式 并注明出处 鳄鱼君
原文地址:《PyMongo和MongoDB数据库的交互 常用操作方法》 发布于2019-12-17

分享到:
赞(0) 赏杯咖啡

文章对你有帮助可赏作者一杯咖啡

支付宝扫一扫打赏

微信扫一扫打赏

Vieu4.6主题
专业打造轻量级个人企业风格博客主题!专注于前端开发,全站响应式布局自适应模板。
切换注册

登录

忘记密码 ?

您也可以使用第三方帐号快捷登录

Q Q 登 录
微 博 登 录
切换登录

注册