【问题标题】:Arangodb insert multiple rows and using UPSERTArangodb 插入多行并使用 UPSERT
【发布时间】:2019-03-11 05:17:56
【问题描述】:

如何使用 UPSERT 在 arangodb 中插入多行? 集合包含一个唯一索引,可防止插入重复文档。 没有唯一索引的多个插入工作正常,但是我如何处理具有唯一索引的多个插入中的更新/替换?

像这样:

INSERT [{doc1},{doc2},{doc3}]
IN collection

UPDATE {} // when duplicate per document

更新 1

SQL 看起来像这样:

INSERT INTO table(name, value)
VALUES('a', '1'), ('b', 2), ('c', 3)

ON DUPLICATE KEY UPDATE name=`value`

谢谢。

【问题讨论】:

  • 您是否尝试过按照 ArangoDB 文档中的说明使用 UPSERT?有什么具体问题吗?您能否添加更多详细信息,说明您使用了哪种查询以及遇到了什么错误?
  • 如果我使用单行插入没问题,我尝试使用多行插入的UPSERT。作为有问题的示例代码,如果我使用 sql,它可能看起来像这样:` INSERT INTO table(name, value) VALUES('a', '1'), ('b', 2), ('c', 4 ) 在重复键更新名称="值" `

标签: arangodb aql


【解决方案1】:

ArangoDB 支持 UPSERT 操作:https://docs.arangodb.com/3.3/AQL/Operations/Upsert.html

来自 ArangoDB 文档:

当使用 upsert 操作的 UPDATE 变体时,找到的文档将被部分更新,这意味着只有 updateExpression 中指定的属性将被更新或添加。当使用 upsert 的 REPLACE 变体时,现有文档将被替换为 updateExpression 的上下文。

您可以使用 UPSERT 更新/替换/插入多条记录,如下所示:

让我们先将几个示例文档插入到您的 collection 中,并首先使用 name 属性的唯一哈希索引:

FOR doc in [
    { "name": "Doc 1", "value": 1 }, 
    { "name": "Doc 2", "value": 1 }, 
    { "name": "Doc 3", "value": 1 }]

INSERT doc IN collection

现在,如果您想执行批量更新插入,您可以运行以下 AQL:

FOR doc in [
    { "name": "Doc 2", "value": 2 }, 
    { "name": "Doc 3", "value": 2 },
    { "name": "Doc 4", "value": 1 }
]

UPSERT { "name": doc.name }

INSERT doc

UPDATE { "value": doc.value } in collection

上面的 AQL 查询插入一个新的 Doc 4 文档并更新 Doc 2Doc 3 的值属性。

【讨论】:

  • 感谢您的回复,arangodb upsert 文档是关于单行插入的。如果我尝试批量插入,那么必须在每个插入 UPSERT{} INSERT{} UPDATE{} 上重复 upsert,为了防止多次调用 upsert,我必须批量插入。
  • UPSERT 也可以进行批处理。请检查我上面的更新答案。
  • 谢谢Peter,这是实现我想要的结果的正确方法。
猜你喜欢
  • 1970-01-01
  • 2018-10-12
  • 1970-01-01
  • 1970-01-01
  • 2021-08-24
  • 1970-01-01
  • 2016-11-21
  • 1970-01-01
  • 2013-06-20
相关资源
最近更新 更多