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