前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >一日一技:使用Pymongo实现更新并返回数据

一日一技:使用Pymongo实现更新并返回数据

作者头像
青南
发布2019-10-06 21:13:14
3.3K0
发布2019-10-06 21:13:14
举报
文章被收录于专栏:未闻Code

有这样一个业务场景:

我有100篇故事,放在 MongoDB 里面。我做了一个 web 接口,每次请求返回一篇故事。希望能够实现:

每次请求返回的故事都不一样,在100次请求里面,每篇故事都需要返回。直到100篇故事全部返回完成。第101次与第1次相同,第102次与第2次相同……

为了实现这个目的,在 MongoDB 里面每一篇故事有3个字段:

代码语言:javascript
复制
{"title": "故事标题", "content": "故事正文", "count": "请求计数"}

如果只有一个人请求这个接口,并且他会等着上一次请求返回完成了再请求下一次,那么关键代码可以这样写:

  • 一开始,所有故事的 count字段都是0
代码语言:javascript
复制
import pymongo

handler = pymongo.MongoClient().story_project.story

story = list(handler.find().sort('count', 1).limit(1))[0]
_id = story['_id']
handler.update_one({'_id': _id}, {'$inc': {'count': 1}})

每次查询都取 count 最小的这一条。查询完成以后,就更新 count 字段。

但是,如果有很多人同时访问这个 web 接口,那么就会出现并发读写冲突的问题。当第一个人读取了一篇故事,还没有来得及更新 count 时,另一个人又访问接口,这样他们两人就会得到同一篇故事。

为了解决这个问题,就需要把查询和更新作为一个原子操作来执行。此时,就要用到 pymongo 的find_one_and_update方法。它根据特定条件查询一条记录,同时更新这条记录的 count 值。这两个行为是通过一条命令完成的,即使多个人同时请求也不会出现并发冲突的情况。

find_one_and_update的使用方法如下:

代码语言:javascript
复制
import pymongo
handler.find_one_and_update({},
                         {'$inc':{'count': 1}},
                         sort=[('count', 1)])

其中,第一个参数表示查询条件,跟find的第一个参数一致。第二个参数表示更新的内容,与update_one的第二个参数一致。sort表示排序方式,它的值是一个包含元组的列表,元组的第一个元素为被排序的字段名,第二个元素为1表示升序,为-1表示降序。

update_one_and_update还有其他参数,可以参考它的官方文档[1]

参考资料

[1]

官方文档: https://api.mongodb.com/python/current/api/pymongo/collection.html#pymongo.collection.Collection.find_one_and_update

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-09-28,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 未闻Code 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 参考资料
相关产品与服务
数据库
云数据库为企业提供了完善的关系型数据库、非关系型数据库、分析型数据库和数据库生态工具。您可以通过产品选择和组合搭建,轻松实现高可靠、高可用性、高性能等数据库需求。云数据库服务也可大幅减少您的运维工作量,更专注于业务发展,让企业一站式享受数据上云及分布式架构的技术红利!
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档