我正在尝试检索文档列表,对返回的文档执行某些操作,然后更新状态以标记已处理的文档。这就是我所拥有的:
cursor = r.db("stuff").table("test").filter(r.row["subject"] == "books").run()
for document in cursor:
print(document["subject"])
document.update({"processed": True})
这似乎运行正常,但“处理”字段没有像我预期的那样得到更新。我可能不正确地接近这个,所以任何指针都会在这里受到赞赏。
更新
这似乎工作正常,但我不禁认为它效率低下:
cursor = r.db("stuff").table("test").filter(r.row["subject"] == "books").run()
for document in cursor:
print(document["subject"])
r.db("certs").table("test").get(document['id']).update({"tpp_processed": True}).run()
答案 0 :(得分:0)
<强> 1。使用for_each
每次要更新单个文档时,您都可以将更改保存在数组中,然后使用update
更新所有文档,而不是使用run
执行forEach
在一个查询中。这看起来像这样:
cursor = r.table('30693613').filter(r.row["subject"] == "book").run(conn)
arr = list(cursor)
for row in arr:
row['processed'] = True
r.expr(arr)
.for_each(lambda row: r.table('30693613').get(row["id"]).update(row))
.run(conn)
这不会执行每次更新的N个网络调用,而只会执行一次网络调用。
<强> 2。构建更新数组并使用forEach
您也可以执行类似的操作来构建数组,并在最后运行一个查询:
cursor = r.db(“stuff”)。table(“test”)。filter(r.row [“subject”] ==“books”)。run() updated_rows = {} 对于光标中的文档: 打印(文档[ “受试者”]) updated_rows.append({id:document [“id”],“tpp_processed”:True}
//之后...... r.expr(updated_rows) .for_each(lambda row:r.table('30693613')。get(row [“id”])。update(row)) .RUN(康涅狄格州)
第3。使用no_reply
最后,您可以保持查询完全相同,然后run
与noreply
保持一致。等待,您的代码将继续运行,不会等到数据库返回响应。
cursor = r.db("stuff").table("test").filter(r.row["subject"] == "books").run()
for document in cursor:
print(document["subject"])
r.db("certs").table("test").get(document['id']).update({"tpp_processed": True}).run(conn, noreply=True)