python操作数据库MongoDB进行增删改查

NOSQL泛指非关系型数据库,是基于键值对的,数据之间没有耦合性,性能非常高。这里介绍利用pyython对MongoDB的数据库进行操作。

一、前期准备

确保已经成功安装好了MongoDB,并且成功启动。如果遇到无法连接到27017端口的错误,可能是数据库还没启动。Mac下安装可以看Mac OSX下 Python网络爬虫开发基础篇-数据库MongoDB安装:

https://blog.csdn.net/qq_37429553/article/details/89309356

并且安装好可视化工具Robo 3T,方便我们查看结果。

 

二、连接数据库

打开Robo 3T,初始结构如下图所示,像admin,local就是数据库的名称,在里面有许多集合(collection),类似关系型数据库中的表。

python操作数据库MongoDB进行增删改查_第1张图片

连接数据库时,我们需要用到MongoClient,然后指定数据库和表名,比如这边我们选择的就是local数据库,选择collection中的students表。

import pymongo
client = pymongo.MongoClient(host='localhost', port=27017)  # 传入参数连接数据库
# 也可以 client = MongoClient('mongo://localhost:27017')

# 指定数据库
db = client.local
# 指定表
collection = db.students

三、插入数据 

 以字典形式可以建立数据,直接调用collection的insert()方法就可以插入数据。在python3.x的版本中,官方已经不推荐使用insert()方法,所以可以使用insert_one和insert_many()方法来分别插入单条和多条数据。

在MongoDB中,每一条数据都有一个_id属性唯一标识。如果没有显式指明该属性,MongoDB就会自动产生一个ObjectId类型的_id属性。

# 插入数据
# 以字典形式建立数据
student1 = {
    'id': '1',
    'name': 'mike',
    'age': 20,
    'gender': 'male'
}
student2 = {
    'id': '2',
    'name': 'linda',
    'age': 19,
    'gender': 'female'
}

student3 = {
    'id': '3',
    'name': 'james',
    'age': 21,
    'gender': 'male'
}

result = collection.insert_many([student1,student2]) # insert 方法插入
result2 = collection.insert_one(student3)
print(result) # 返回对应的id集合
print(result.inserted_ids) # 返回类型是InsertManyResult,利用inserted——ids属性可以获取插入数据的_id列表
print(result2)
print(result2.inserted_id)

返回结果如下:

/anaconda3/python.app/Contents/MacOS/python /Users/limw/PycharmProjects/pachon_test/MongoDB_test/MongoDB.py

[ObjectId('5ccf9e717320249bde96a0c4'), ObjectId('5ccf9e717320249bde96a0c5')]

5ccf9e717320249bde96a0c6

打开Robo 3T可以看到插入成功

python操作数据库MongoDB进行增删改查_第2张图片

四、查询数据 

这里最好新建一个python文件,因为每次执行插入操作,都会把已有的数据再进行存储。

利用find_one() 或者 find()进行查询,前者返回单个数据,后者返回一个生成器对象。

查询name是mike的学生信息:

result = collection.find_one({'name':'mike'})
print(type(result))                          
print(result)                                

结果:


{'_id': ObjectId('5ccf9e717320249bde96a0c4'), 'id': '1', 'name': 'mike', 'age': 20, 'gender': 'male'}

根据ObjectId进行查询

result = collection.find_one({'_id':ObjectId('5ccf9e717320249bde96a0c4')})
print(result)                                                             

结果:

{'_id': ObjectId('5ccf9e717320249bde96a0c4'), 'id': '1', 'name': 'mike', 'age': 20, 'gender': 'male'}

查找多条数据,如年龄大于20的学生信息,这里需要用到比较符号$gt:

results = collection.find({'age':{'$gt':20}})    
# 由于是生成器,所以遍历得到所有结果                              
for result in results:                           
    print(result)                                

结果:

{'_id': ObjectId('5ccf9e717320249bde96a0c4'), 'id': '1', 'name': 'mike', 'age': 20, 'gender': 'male'}
{'_id': ObjectId('5ccf9e717320249bde96a0c6'), 'id': '3', 'name': 'james', 'age': 21, 'gender': 'male'}
其他比较符
符号 含义 用法
$lt 小于 {'age':{'$lt' : 20}}
$lte 小于等于 {'age':{'$lte' : 20}}
$gte 大于等于 {'age':{'$gte' : 20}}
$ne 不等于 {'age':{'$ne' : 20}}
$in 在范围内 {'age':{'$in' : [20,23]}}
$nin 不在范围内 {'age':{'$nin' : [20,23]}}

  

利用正则表达式来进行匹配查找:

# 利用$regex来进行正则匹配,查找姓名以l开头的学生信息                        
results = collection.find({'name': {'$regex': '^l.*'}})
for result in results:                                 
    print(result)                                      

结果:

{'_id': ObjectId('5ccf9e717320249bde96a0c5'), 'id': '2', 'name': 'linda', 'age': 19, 'gender': 'female'}

五、更改数据

这边可以使用update()方法,指定更新的条件和更新后的数据就可以

这里以james的信息为例,james现在21岁,我们更改他的年龄

#指定更新条件,姓名为james
condition = {'name':'james'}
#找到信息
student = collection.find_one(condition)
# 更新后的信息
student['age']= 34
result = collection.update(condition,student)
print(result)

结果:ok代表执行成功,nModified表示影响的条数。

{'n': 1, 'nModified': 1, 'ok': 1.0, 'updatedExisting': True}

但是官方也不推荐update(),所以最好采取update_one()和update_many()。这样第二个参数不能直接传入修改后的字典,而需要使用{'$set':student}这样的形式。返回结果可以用matched_count和modified_count方法获得匹配的数据条数和影响的数据条数。

# 指定更新条件,姓名为james
condition = {'name': 'james'}
# 找到信息
student = collection.find_one(condition)
# 更新后的信息
student['age'] = 28
result = collection.update_one(condition, {'$set': student})
print(result)
print(result.matched_count, result.modified_count)

结果如下:


1 0

修改多条数据

# 指定更新条件,年龄大于20
condition = {'age':{'$gt':20}}
result = collection.update_many(condition, {'$inc': {'age':1}})
print(result)
print(result.matched_count, result.modified_count)

六、删除数据

可以使用collection的remove()方法,这里演示delete_one()和delete_many()两个方法。

# 删除名字叫mike的学生信息
result = collection.delete_one({'name':'mike'})
print(result)
# 输出影响的条数
print(result.deleted_count)
# 删除年龄小于20的学生信息
result = collection.delete_many({'age':{'lt':20}})
print(result.deleted_count)

七、其他功能

更多功能可以参见官方文档

http://api.mongodb.com/python/current/api/pymongo/collection.html

你可能感兴趣的:(Python,数据库,python,MongoDB,数据库)