"If Not Exists" 在 Arangodb 上

"If Not Exists" on Arangodb

我想使用自定义键将值插入到 Arango-DB 中,但我没有找到像 SQL

那样的 'if not exists' 函数
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

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

INSERT{
    _key:               "key",
    value1:             "value"
}in Users OPTIONS {ignoreErrors: true}
return NEW

看看 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 块然后显示它在未找到记录时插入的 keys/values。

在这种情况下,它还将已验证设置为 false,因为任何刚刚创建的新用户都没有经过验证。应用程序其他地方的另一个命令负责将此标志转换为 true

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

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

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

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

是的,这与其他数据库语言中的 IF NOT EXISTS 样式命令完全一样。如果比较器不匹配,则插入新记录,如果比较器匹配,则什么也不做!

希望对您有所帮助!

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

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

没有不必要的写操作