嵌套数组->obj 中的 RethinkDB 更新字段
RethinkDB update field inside nested array->obj
我的行如下所示:
{"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)
这可以改进吗?另外,我将同时更新很多网址...无论如何要通过批量更新来进一步提高性能?
作为一般性建议,如果您计划对数组中的嵌入文档执行许多操作。您可能想要展开并展平您的数据模型。
更新数组中的单个文档既笨拙又困难,以下是一种可能方法的步骤:
- 获取要编辑的原始嵌入文档的值
- 获取其索引的嵌入文档的索引
- 修改嵌入文档
- 用修改后的
替换数组中的原始嵌入文档
- 更新整个外部文档。
或者,您所做的是:
- 将文档缩小到某个域,在本例中 "hillaryclinton.com"
- 映射
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",
}
}]
}
我的行如下所示:
{"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)
这可以改进吗?另外,我将同时更新很多网址...无论如何要通过批量更新来进一步提高性能?
作为一般性建议,如果您计划对数组中的嵌入文档执行许多操作。您可能想要展开并展平您的数据模型。
更新数组中的单个文档既笨拙又困难,以下是一种可能方法的步骤:
- 获取要编辑的原始嵌入文档的值
- 获取其索引的嵌入文档的索引
- 修改嵌入文档
- 用修改后的 替换数组中的原始嵌入文档
- 更新整个外部文档。
或者,您所做的是:
- 将文档缩小到某个域,在本例中 "hillaryclinton.com"
- 映射
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",
}
}]
}