【问题标题】:RethinkDB update field inside nested array->objRethinkDB 更新嵌套数组中的字段-> obj
【发布时间】:2016-08-04 04:30:11
【问题描述】:

这是我的行的样子:

{"id": x ,

"data": [
  {
  "someId": 1 ,
  "url": https://twitter.com/HillaryClinton?ref_src=twsrc%5Egoogle%7Ctwcamp%5Eserp%7Ctwgr%5Eauthor, »
  } ,

  {
  "someId": 2 ,
  "url": http://nymag.com/daily/intelligencer/2016/05/hillary-clinton-candidacy.html, »
  } ,
]}

我在 data.url 上创建了二级索引,因此检索文档很容易,但我如何最有效地更新那个特定的嵌套对象?

我可能正在向它添加新键或只是更新现有键(下面示例中的 newField、anotherField)。

最终结果应如下所示:

  "data": [
  {
  "someId": 1 ,
  "url": https://twitter.com/HillaryClinton?ref_src=twsrc%5Egoogle%7Ctwcamp%5Eserp%7Ctwgr%5Eauthor,

  "newField": 5,
  "anotherField": 12
  } 
...

编辑:让它像这样工作(python):

a = r.db("lovli").table("KeyO").get_all("https://www.hillaryclinton.com/", index= "url").update(
    lambda doc:
        {"data": doc['data'].map(lambda singleData:
            r.branch(
            singleData['url'] == "https://www.hillaryclinton.com/",
            singleData.merge({"status_tweet":3, "pda": 1}),
            singleData
            )
        )
        }

).run(conn)

这可以改进吗?另外,我将同时更新很多网址...无论如何通过批量执行此操作来进一步提高性能?

【问题讨论】:

    标签: rethinkdb rethinkdb-python reql


    【解决方案1】:

    作为一般建议,如果您计划对数组内的嵌入文档执行许多操作。您可能想要展开和展平您的数据模型。

    更新数组中的单个文档既尴尬又困难,以下是一种可能方法的步骤:

    1. 获取要编辑的原始嵌入文档的值
    2. 获取嵌入文档的索引
    3. 修改嵌入文档
    4. 用修改后的数组替换原来嵌入的文档
    5. 更新整个外部文档。

    或者,你所做的是:

    1. 将文档缩小到某个域,在本例中为“hillaryclinton.com”
    2. 映射data数组中的N条推文,检查它们是否匹配,如果匹配则更新。

    在这种情况下,在最坏的情况下,您将遇到过滤后的 M 个文档,乘以 N 个嵌入文档。你可能想看看this other answer我给了一个有类似设计问题的人。但是,我认为以下将导致卓越的性能。

    如果您改为这样存储数据:

    {
      "secondary_id": x,
      "data": {
        "someId": 1 ,
        "url": "https://twitter.com/HillaryClinton?ref_src=twsrc%5Egoogle%7Ctwcamp%5Eserp%7Ctwgr%5Eauthor", 
      } 
    }, {
     "secondary_id": x,
     "data": {
      "secondary_id": 2 ,
      "url": "http://nymag.com/daily/intelligencer/2016/05/hillary-clinton-candidacy.html", 
      }
    } 
    

    然后,您可以在 url 索引所基于的任何内容和值 data.url 上创建复合索引,这可能会显着减少您的操作。

    如果不了解更多关于您将在数据集中经常访问的内容,很难给出更多指示,但我认为这应该会更好。当您想要重新创建您拥有的原始数据模型时,它看起来像这样:

    r.db("lovli").table("Key0").get_all( SEARCH_URL, index="url").group("secondary_id")
    

    你会得到类似的东西。这里以x为例:

    {
      "group": x,
      "reduction": [{
          "secondary_id": x,
          "data": {
            "someId": 1 ,
            "url": "https://twitter.com/HillaryClinton?ref_src=twsrc%5Egoogle%7Ctwcamp%5Eserp%7Ctwgr%5Eauthor", 
          } 
        }, {
         "secondary_id": x,
         "data": {
          "secondary_id": 2 ,
          "url": "http://nymag.com/daily/intelligencer/2016/05/hillary-clinton-candidacy.html", 
          }
        }]
    }
    

    【讨论】:

    • 谢谢,虽然我无法解决这个问题...像这样查询和#2:单独,因为每个URL都包含一些额外的数据,我想每月重新检查几次,如果有任何更改更新#1(大行)。在搜索“大行”时,我只能查询里面的实际 url。希望这更有意义,如果不是,我可以用更多信息更新原始问题。干杯
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-07-05
    • 2012-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-27
    • 1970-01-01
    相关资源
    最近更新 更多