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),类似关系型数据库中的表。
连接数据库时,我们需要用到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文件,因为每次执行插入操作,都会把已有的数据再进行存储。
利用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