爬虫之MongoDB存储(下)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/chengqiuming/article/details/86499980

一 计数

1 代码

import pymongo
# 一般来说,传入MongoDB的IP及端口即可,其中第一个参数为地址host,
# 第二个参数为端口port(如果不给它传递参数,默认是27017)
client = pymongo.MongoClient(host='localhost', port=27017)
# MongoClient的第一个参数host还可以直接传入MongoDB的连接字符串,它以mongodb开头
#client = pymongo.MongoClient('mongodb://localhost:27017/')
# client的test属性即可返回test数据库。
db = client.test
# 指定数据库的第二种方法
# db = client['test']
# 指定集合的第一种方法
collection = db.students
# 统计所有数据条数
count = collection.find().count()
print(count)
# 统计符合某个条件的数据
count = collection.find({'age': 20}).count()
print(count)

2 结果

E:\WebSpider\venv\Scripts\python.exe E:/WebSpider/5_3_1.py
2
1

二 排序

1 代码

import pymongo
# 一般来说,传入MongoDB的IP及端口即可,其中第一个参数为地址host,
# 第二个参数为端口port(如果不给它传递参数,默认是27017)
client = pymongo.MongoClient(host='localhost', port=27017)
# MongoClient的第一个参数host还可以直接传入MongoDB的连接字符串,它以mongodb开头
#client = pymongo.MongoClient('mongodb://localhost:27017/')
# client的test属性即可返回test数据库。
db = client.test
# 指定数据库的第二种方法
# db = client['test']
# 指定集合的第一种方法
collection = db.students
# 直接调用sort()方法,并在其中传入排序的字段及升降序标志
# 如果降序 pymongo.DESCENDING
results = collection.find().sort('name', pymongo.ASCENDING)
print([result['name'] for result in results])

2 结果

E:\WebSpider\venv\Scripts\python.exe E:/WebSpider/5_3_1.py
['Jordan', 'Mike']

三 偏移

1 点睛

我们可能想只取某几个元素,这时可以利用skip()方法偏移几个位置。

2 skip

2.1 代码

import pymongo
# 一般来说,传入MongoDB的IP及端口即可,其中第一个参数为地址host,
# 第二个参数为端口port(如果不给它传递参数,默认是27017)
client = pymongo.MongoClient(host='localhost', port=27017)
# MongoClient的第一个参数host还可以直接传入MongoDB的连接字符串,它以mongodb开头
#client = pymongo.MongoClient('mongodb://localhost:27017/')
# client的test属性即可返回test数据库。
db = client.test
# 指定数据库的第二种方法
# db = client['test']
# 指定集合的第一种方法
collection = db.students
# 直接调用sort()方法,并在其中传入排序的字段及升降序标志
# 如果降序 pymongo.DESCENDING
# results = collection.find().sort('name', pymongo.ASCENDING)
# print([result['name'] for result in results])
# 比如偏移2,就忽略前两个元素,得到第三个及以后的元素
results = collection.find().sort('name', pymongo.ASCENDING).skip(2)
print([result['name'] for result in results])

2.2 结果

E:\WebSpider\venv\Scripts\python.exe E:/WebSpider/5_3_1.py
['Mike', 'Mordan']

3 limit

3.1 代码

import pymongo
# 一般来说,传入MongoDB的IP及端口即可,其中第一个参数为地址host,
# 第二个参数为端口port(如果不给它传递参数,默认是27017)
client = pymongo.MongoClient(host='localhost', port=27017)
# MongoClient的第一个参数host还可以直接传入MongoDB的连接字符串,它以mongodb开头
#client = pymongo.MongoClient('mongodb://localhost:27017/')
# client的test属性即可返回test数据库。
db = client.test
# 指定数据库的第二种方法
# db = client['test']
# 指定集合的第一种方法
collection = db.students

results = collection.find().sort('name', pymongo.ASCENDING).skip(2).limit(1)
print([result['name'] for result in results])

3.2 结果

E:\WebSpider\venv\Scripts\python.exe E:/WebSpider/5_3_1.py
['Mike']

3.3 说明

值得注意的是,在数据库数量非常庞大的时候,如千万、亿级别,最好不要使用大的偏移量来查询数据,因为这样很可能导致内存溢出。

四 更新

1 一般方法

1.1 代码

import pymongo

client = pymongo.MongoClient(host='localhost', port=27017)
db = client.test
collection = db.students
condition = {'name': 'Mike'}
student = collection.find_one(condition)
student['age'] = 25
# update()方法,指定更新的条件和更新后的数据即可。
result = collection.update(condition, student)
print(result)

1.2 结果

E:\WebSpider\venv\Scripts\python.exe E:/WebSpider/5_3_1.py
{'n': 1, 'nModified': 1, 'ok': 1.0, 'updatedExisting': True}

1.3 说明

返回结果是字典形式,ok代表执行成功,nModified代表影响的数据条数。

2 $set操作

2.1 代码

import pymongo

client = pymongo.MongoClient(host='localhost', port=27017)
db = client.test
collection = db.students
condition = {'name': 'Mike'}
student = collection.find_one(condition)
student['age'] = 26
# # update()方法,指定更新的条件和更新后的数据即可。
# result = collection.update(condition, student)
# 可以只更新student字典内存在的字段。如果原先还有其他字段,则不会更新,也不会删除。
result = collection.update(condition, {'$set': student})
print(result)

2.2 结果

E:\WebSpider\venv\Scripts\python.exe E:/WebSpider/5_3_1.py
{'n': 1, 'nModified': 1, 'ok': 1.0, 'updatedExisting': True}

3 update_one

3.1 点睛

update()方法其实也是官方不推荐使用的方法。而是推荐使用update_one()方法和update_many()方法,用法更加严格,它们的第二个参数需要使用$类型操作符作为字典的键名。

3.2 代码

import pymongo

client = pymongo.MongoClient(host='localhost', port=27017)
db = client.test
collection = db.students

condition = {'name': 'Mike'}
student = collection.find_one(condition)
student['age'] = 24
# 调用了update_one()方法,第二个参数不能再直接传入修改后的字典,
# 而是需要使用{'$set': student}这样的形式,其返回结果是UpdateResult类型。
# 然后分别调用matched_count和modified_count属性,可以获得匹配的数据条数和影响的数据条数。
result = collection.update_one(condition, {'$set': student})
print(result)
print(result.matched_count, result.modified_count)

3.3 说明

E:\WebSpider\venv\Scripts\python.exe E:/WebSpider/5_3_1.py
<pymongo.results.UpdateResult object at 0x000002BB4AF0C508>
1 1

4 实战

4.1 代码

import pymongo

client = pymongo.MongoClient(host='localhost', port=27017)
db = client.test
collection = db.students

condition = {'age': {'$gt': 20}}
# 执行之后会将第一条符合条件的数据年龄加1。
result = collection.update_one(condition, {'$inc': {'age': 1}})
print(result)
print(result.matched_count, result.modified_count)

4.2 结果

E:\WebSpider\venv\Scripts\python.exe E:/WebSpider/5_3_1.py
<pymongo.results.UpdateResult object at 0x00000193BCFDC508>
1 1

5 update_many

5.1 代码

import pymongo

client = pymongo.MongoClient(host='localhost', port=27017)
db = client.test
collection = db.students

condition = {'age': {'$gt': 20}}
# 匹配到的数据都会被更新
result = collection.update_many(condition, {'$inc': {'age': 1}})
print(result)
print(result.matched_count, result.modified_count)

5.2 结果

E:\WebSpider\venv\Scripts\python.exe E:/WebSpider/5_3_1.py
<pymongo.results.UpdateResult object at 0x000001B2B966C508>

五 删除 

1 基本用法

1.1 代码

import pymongo

client = pymongo.MongoClient(host='localhost', port=27017)
db = client.test
collection = db.students
# 删除操作比较简单,直接调用remove()方法指定删除的条件即可,此时符合条件的所有数据均会被删除
result = collection.remove({'name': 'Mike'})
print(result)

1.2 结果

E:\WebSpider\venv\Scripts\python.exe E:/WebSpider/5_3_1.py
{'n': 1, 'ok': 1.0}

2 delete_one()和delete_many()

2.1 代码

import pymongo

client = pymongo.MongoClient(host='localhost', port=27017)
db = client.test
collection = db.students

# delete_one()即删除第一条符合条件的数据,delete_many()即删除所有符合条件的数据。
# 它们的返回结果都是DeleteResult类型,可以调用deleted_count属性获取删除的数据条数。
result = collection.delete_one({'name': 'Kevin'})
print(result)
print(result.deleted_count)
result = collection.delete_many({'age': {'$lt': 25}})
print(result.deleted_count)

2.2 结果

E:\WebSpider\venv\Scripts\python.exe E:/WebSpider/5_3_1.py
<pymongo.results.DeleteResult object at 0x000001657FCDC508>
0
3

六 其他操作

另外,PyMongo还提供了一些组合方法,如find_one_and_delete()、find_one_and_replace()和find_one_and_update(),它们是查找后删除、替换和更新操作,其用法与上述方法基本一致。

另外,还可以对索引进行操作,相关方法有create_index()、create_indexes()和drop_index()等。

猜你喜欢

转载自blog.csdn.net/chengqiuming/article/details/86499980
今日推荐