此外,PyMongo还提供了另外两个方法:insert_one和insert_many,对应创建一条数据和多条数据。
result = collection.insert_one(article1)result = collection.insert_many([article1, article2])
这两个方法返回值与insert返回值略有不同,返回的是个对象。
insert_one返回InsertOneResult,InsertOneResult.inserted_id才是_id值。
insert_many返回InsertManyResult,InsertManyResult.inserted_ids是_id的列表。
6. 查询数据查询数据有两个方法:find_one和find。
先说find_one,看名称就知道,是查一条文档数据,返回结果是一个字典类型的记录。
result = collection.find_one({"article_id": 1})print(type(result))
print(result)
输出结果:
<class 'dict'>{'_id': ObjectId('5efb1ecc7ca7cd50ed1150ed'), 'article_id': 1, 'title': '文章标题1', 'body': '文章内容1', 'action_time': datetime.datetime(2020, 6, 30, 11, 15, 24, 97000)}
当然也可以使用_id查询:
from bson.objectid import ObjectIdresult = collection.find_one({'_id': ObjectId('5efb1ecc7ca7cd50ed1150ed')})
find方法,用来查询多条数据。
results = collection.find({"title": {"$ne":""}})print(type(results))
print(results)
for result in results:
print(result)
输出结果:
<class 'pymongo.cursor.Cursor'><pymongo.cursor.Cursor object at 0x7f82c2cf7d50>
{'_id': ObjectId('5efb1ecc7ca7cd50ed1150ed'), 'article_id': 1, 'title': '文章标题1', 'body': '文章内容1', 'action_time': datetime.datetime(2020, 6, 30, 11, 15, 24, 97000)}
{'_id': ObjectId('5efb1ecc7ca7cd50ed1150ee'), 'article_id': 2, 'title': '文章标题2', 'body': '文章内容2', 'action_time': datetime.datetime(2020, 6, 30, 11, 15, 24, 97000)}
能看出,find查询的结果是一个游标cursor,指向返回的数据集合。数据可以循环读出。
7. 结果统计统计查询结果有多少条数据,PyMongo提供了一个count方法:
results = collection.find({"title": {"$ne":""}}).count()或者查整个数据集的数据:
results = collection.find().count()8. 排序查询
排序也是一个方法,sort:
results = collection.find({"title": {"$ne":""}}).sort("action_time", pymongo.ASCENDING)升序是pymongo.ASCENDING,降序是pymongo.DESCENDING。
9. 偏移和限定两个用处不大不小的功能,通常在一起用,当然分开也没关系。
results = collection.find({"title": {"$ne":""}}).sort("action_time", pymongo.DESCENDING).skip(1).limit(1)limit限定了结果集取多少条数据,而skip则决定跳过多少条数据后去取。
在数据量不大的情况下,可以用来做分页。而如果数据量很大,这种方式效率不高,更好的做法是记住前一个页的最后一条数据的关键值,例如_id,查询时取条件大于这个值的数据。
10. 更新数据PyMongo提供了两个更新数据的方法:update_one和update_many。代码是这样的:
filter = {"article_id": 1}update = {"$set": {"body": "新的文章内容"}}
result = collection.update_one(filter, update)
print(type(result))
返回一个对象UpdateResult,里面包含更新结果的全部信息。
注意:这儿有个不同于传统SQL的地方,一定要注意。当更新的条件匹配到多条数据时,update_one只会更新匹配到的数据集中第一条数据,update_many可以更新匹配到的全部数据。所以,如果用update_one,除非是你本意,一定要确定条件匹配到的数据唯一。
11. 删除数据也同样有两个方法:delete_one和delete_many。用法和更新相似:
filter = {"article_id": 1}result = collection.delete_one(filter)
print(type(result))
同样的,delete_one也只会删除匹配到的数据集中第一条数据。
11. 原子级处理