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

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

摄影:产品经理买单:kingname

有这样一个业务场景:

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

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

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

{"title": "故事标题", "content": "故事正文", "count": "请求计数"}

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

  • 一开始,所有故事的 count字段都是0
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的使用方法如下:

import pymongo
handler.find_one_and_update({},
                         {'$inc':{'count': 1}},
                         sort=[('count', 1)])

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

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

目录
相关文章
|
7月前
|
NoSQL MongoDB Python
深入了解 Python MongoDB 操作:排序、删除、更新、结果限制全面解析
使用 sort() 方法对结果进行升序或降序排序。 sort() 方法接受一个参数用于“字段名”,一个参数用于“方向”(升序是默认方向)。
115 0
|
2月前
|
存储 关系型数据库 MySQL
MySQL 存储过程返回更新前记录
MySQL 存储过程返回更新前记录
65 3
|
7月前
|
SQL 关系型数据库 MySQL
python在mysql中插入或者更新null空值
这段代码是Python操作MySQL数据库的示例。它执行SQL查询从表`a_kuakao_school`中选取`id`,`university_id`和`grade`,当`university_id`大于0时按升序排列。然后遍历结果,根据`row[4]`的值决定`grade`是否为`NULL`。若不为空,`grade`被格式化为字符串;否则,设为`NULL`。接着构造UPDATE语句更新`university`表中对应`id`的`grade`值,并提交事务。重要的是,字符串`NULL`不应加引号,否则更新会失败。
171 2
|
3月前
|
API PHP 数据库
Laravel框架下通过DB获取数据并转为数组的方法
通过上述方法,Laravel为开发者提供了一套灵活而强大的工具,用于从数据库中检索数据并将其转换为数组。无论是使用DB Facade直接执行查询,还是利用模型的方法,Laravel都能够简化这一过程,使得代码既简洁又富有表现力。在实际开发中,选择最适合你需求的方法可以有效提高开发效率和应用性能。
123 0
|
6月前
|
存储 SQL 关系型数据库
在MySQL中使用存储过程返回更新前的记录
在MySQL中使用存储过程返回更新前的记录
92 0
|
7月前
|
存储 SQL 关系型数据库
mysql 存储过程返回更新前记录
MySQL存储过程帮助我们在更新数据后获取旧记录,适用于审计和回滚操作。通过`BEFORE UPDATE`触发器和临时表,可以捕获并保存更新前的记录。示例展示了如何创建存储过程,当更新`employees`表时,将旧记录保存至临时表`old_records`。此外,还探讨了存储过程在数据版本控制、审计和回滚操作中的应用,以及如何与事务结合确保数据一致性。通过学习和使用存储过程,可以更有效地管理和保护数据库中的数据。
387 0
|
JSON 关系型数据库 MySQL
MySQL:json字段查询:数组、对象、成员检查
MySQL:json字段查询:数组、对象、成员检查
910 0
|
SQL 关系型数据库 MySQL
MySql 使用 NOT IN 返回值包含null值,返回数据不全
MySql 使用 NOT IN 返回值包含null值,返回数据不全
278 0
MySql 使用 NOT IN 返回值包含null值,返回数据不全
Mongo:update更新多条数据
Mongo:update更新多条数据
277 0
|
SQL NoSQL MongoDB
MongoDB(13)- 查询操作返回指定的字段
MongoDB(13)- 查询操作返回指定的字段
514 0