2

我想使用自定义键将值插入 Arango-DB,但我没有找到像 SQL 那样的“如果不存在”函数

let exist = (
  FOR u IN User
     FILTER u._key == "newkey"
     return u
  )
Filter LENGTH(exist)==null
    INSERT{
        _key:               "newkey",
         value1:             "value"
     } IN User
return NEW

像这样的东西也行不通

INSERT{
    _key:               "newkey",
    value1:             "value"
}
IN User ON DUPLICATE KEY IGNORE
return NEW
4

3 回答 3

4

看看UPSERT命令怎么样,只给它INSERT部分命令的说明,而不给UPDATE. 这样它只会在它不存在时执行。

https://docs.arangodb.com/3.0.10/AQL/Operations/Upsert.html

这是一个使用它的例子:

UPSERT {
    username: @username
}
INSERT {
    username: @username,
    fullname: @fullname,
    verified: false
}
UPDATE {
}
IN Users

RETURN {
    user: NEW
}

UPSERT命令包含三个部分。

第一个是比较器,它是如何识别文档是否存在的。在这种情况下,比较器是{ username: @username }。它使用它来搜索Users集合以查看是否存在匹配项。

如果没有匹配,它执行INSERT命令。
如果有匹配,它执行UPDATE命令。

在这种情况下,我们一直很棘手,没有为UPDATE命令提供任何东西,所以如果它存在它就不会更新任何东西,它只会在它不存在时插入。

INSERT然后,如果找不到记录, 该块会显示它插入的键/值。

在这种情况下,它也设置为已验证,false因为刚刚创建的任何新用户都未经过验证。将此标志转换为true.

还要注意RETURN条目,它引用,如果需要NEW,您还可以引用一个名为的东西。OLD

这些是命令提供的内部返回值UPSERT,它们引用了所引用文档的两个版本。

NEW始终填充,它包含文档的最新版本,无论是否进行了更新。

OLD包含文档的旧版本,在使用新值更新之前。如果文档未更新,则返回 null,因此在这种情况下,它始终为 null,因为不会发生更新。

是的,这完全像IF NOT EXISTS其他数据库语言中的样式命令一样执行。如果比较器不匹配,则插入新记录,如果比较器匹配,则不执行任何操作!

我希望这会有所帮助!

于 2016-12-14T14:43:04.153 回答
0
LET existingUser = FIRST(
  FOR u IN User
     FILTER u._key == "newkey"
     return u
)
LET newUser = FIRST(
  FILTER existingUser == null
  INSERT{
        _key:               "newkey",
         value1:             "value"
     } IN User
  RETURN NEW
)
RETURN existingUser || newUser

这将返回现有用户或插入一个用户(如果它不存在)。然后返回用户对象。

没有不必要的写操作

于 2021-05-11T08:42:14.633 回答
-1

有点不满意,Arangodb 社区帮助了我。它不存在像“IF NOT EXITS”这样的查询,在这种情况下数据库系统会抛出一个异常,为了使查询可用,您必须添加一个忽略错误消息对话框。

INSERT{
    _key:               "key",
    value1:             "value"
}in Users OPTIONS {ignoreErrors: true}
return NEW
于 2016-12-13T16:13:41.667 回答