"If Not Exists" 关于阿兰戈德



我想用自定义键插入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

如何查看 UPSERT命令,仅给命令的 INSERT部分提供指令,而 UPDATE nothens nothens nother。这样,只有在不存在的情况下才能执行。

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样式命令执行。如果比较器不匹配,它将插入新记录,如果比较器匹配,则无济于事!

我希望有帮助!

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

这将返回现有用户或如果不存在的用户插入。然后返回用户对象。

没有不必要的写操作

它有点不满意,Arangodb社区为我提供了帮助。它不存在诸如"如果不是退出"之类的查询,在这种情况下,数据库系统会引发,以使查询可用,必须添加一个忽略错误消息 - 毫无疑问。

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

最新更新