打印结果后更新文档

时间:2015-06-07 12:36:03

标签: rethinkdb

我正在尝试检索文档列表,对返回的文档执行某些操作,然后更新状态以标记已处理的文档。这就是我所拥有的:

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()

1 个答案:

答案 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

最后,您可以保持查询完全相同,然后runnoreply保持一致。等待,您的代码将继续运行,不会等到数据库返回响应。

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)