接上文 数据的存储--MongoDB文档存储(一)https://developer.aliyun.com/article/1618974?
7.计数
要统计查询结果包含多少条数据,可以调用count方法。例如统计所有数据条数,代码如下:
count = collection.find().count()
print(count)
统计符合某个条件的数据有多少条,代码如下:
count = collection.find({
'age': 20}).count()
print(count)
运行结果是一个数值,即符合条件的数据条数。
8.排序
排序时,直接调用sort方法,并传入排序的字段及升降序标志即可。实例代码如下:
import pymongo
# 连接数据库
client = pymongo.MongoClient(host='localhost', port=27017)
# 指定数据库
db = client.test
# 指定集合
collection = db.students
# 调用sort方法
results = collection.find().sort('name', pymongo.ASCENDING)
print([result['name'] for result in results])
运行结果如下:
['Bob', 'Jordan', 'Mike', 'Nani']
这里我们调用pymongo.ASCENDING指定按生序排序。如果要降序,可以传入pymongo.DESCENDINg。
9.偏移
在某些情况下,可能只想取某几个元素,这时可以利用skip方法偏移几个位置,例如偏移2,即可忽略前两个元素,获取第三个及以后的元素:
import pymongo
client = pymongo.MongoClient(host='localhost', port=27017)
db = client.test
collection = db.students
results = collection.find().sort('name', pymongo.ASCENDING).skip(2)
print([result['name'] for result in results])
运行结果如下:
['Mike', 'Nani']
另外,还可以使用limit方法指定要获取的结果个数,实例代码如下:
results = collection.find().sort('name', pymongo.ASCENDING).skip(1).limit(3)
print([result['name'] for result in results])
运行结果如下:
['Jordan', 'Mike', 'Nani']
值得注意的是, 在数据库中数据量非常庞大的时候(例如千万、亿级别),最好不要使用大偏移量来查询数据,因为这样很可能导致内存溢出。此时可以使用类似如下操作来查询:
from bson.objectid import ObjectId
collection.find({
'_id': {
'$gt': ObjectId('65548291f1761603ce61adad')}})
这里需要记录好上次查询的_id。
10.更新
对于数据更新,我们可以使用update_one方法,在其中指定更新的条件和更新后的数据即可。例如:
import pymongo
client = pymongo.MongoClient(host='localhost', port=27017)
db = client.test
collection = db.students
condition = {
'name': 'Jordan'}
student = collection.find_one(condition)
student['age'] = 25
result = collection.update_one(condition, {
'$set': student})
print(result)
print(result.matched_count, result.modified_count)
这里调用的是update_one方法,其第二个参数不能再直接传入修改后的字典,而是需要使用{‘$set’: student}这种形式的数据。然后分别调用matched_count和modified_count属性,可以获得匹配的数据条数和影响的数据条数。
运行结果如下:
<pymongo.results.UpdateResult object at 0x10ae5bbe0>
1 0
可以发现update_one 方法的返回结果是UpdateResult类型。我们再看一个例子:
condition = {
'age': {
'$gt': 20}}
result = collection.update_one(condition, {
'$inc': {
'age': 1}})
print(result)
print(result.matched_count, result.modified_
这里查询条件为age大于20,然后更新条件是{‘$inc’: {‘age’: 1}}, 也就是对age加1,因此执行update_one方法之后,会对第一条符合查询条件的学生数据的age加1。
运行结果如下:
<pymongo.results.UpdateResult object at 0x10aa59c70>
1 1
可以看到匹配条数为1条,影响条数也是1条。
但如果调用update_many方法,则会更新所有符合条件的数据,实例代码如下:
condition = {
'age': {
'$gt': 20}}
result = collection.update_many(condition, {
'$inc': {
'age': 1}})
print(result)
print(result.matched_count, result.modified_count)
运行结果如下:
<pymongo.results.UpdateResult object at 0x10dfd9c70>
2 2
11.删除
删除操作比较简单,直接调用delete_one方法和delete_many。delete_one删除第一条符合条件的数据,delete_many删除所有符合条件的数据均会被删除。实例代码如下:
import pymongo
client = pymongo.MongoClient(host='localhost', port=27017)
db = client.test
collection = db.students
result = collection.delete_one({
'name': '赵玲薇'})
print(result)
删除多条数符合条件的数据,实例代码如下:
result = collection.delete_many({
'age': {
'$gt': 19}})
print(result.deleted_count)
运行结果如下:
3
调用delete_count属性获取删除的数据条数。
12.其他操作
除了以后操作,PyMongo还提供了一些组合方法,例如find_one_and_delete、find_one_and_replace和find_one_and_update,分别是查找后删除、替换和更新操作,用法与上述方法基本一致。