&引用;“如果不存在”;关于Arangodb
我想用自定义键将值插入Arango数据库,但我没有找到像SQL那样的“if not exists”函数&引用;“如果不存在”;关于Arangodb,arangodb,aql,arangojs,Arangodb,Aql,Arangojs,我想用自定义键将值插入Arango数据库,但我没有找到像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"
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”这样的查询,数据库系统在本例中抛出一个exeption,为了使查询可用,必须添加一个ignore错误消息对话框
INSERT{
_key: "key",
value1: "value"
}in Users OPTIONS {ignoreErrors: true}
return NEW
查看
UPSERT
命令,只对命令的INSERT
部分给出说明,而对UPDATE
则不给出任何说明。这样,它只有在不存在的情况下才会执行
下面是一个正在使用的示例:
UPSERT {
username: @username
}
INSERT {
username: @username,
fullname: @fullname,
verified: false
}
UPDATE {
}
IN Users
RETURN {
user: NEW
}
UPSERT
命令有三个部分
第一个是比较器,它是如何识别文档是否存在的。在本例中,比较器是{username:@username}
。它使用它来搜索用户
集合,查看是否存在匹配项
如果不匹配,则执行INSERT
命令。如果存在匹配项,则执行
UPDATE
命令
在本例中,我们使用了一些技巧,没有为UPDATE
命令提供任何内容,因此如果它存在,它不会更新任何内容,只有在它不存在时才会插入
然后,INSERT
块显示未找到记录时插入的键/值
在这种情况下,它还将verified设置为false
,因为刚刚创建的任何新用户都没有经过验证。应用程序中其他地方的另一个命令负责将此标志转换为true
还要注意RETURN
条目,它引用NEW
,如果需要,还可以引用名为OLD
的内容
这些是由UPSERT
命令提供的内部返回值,它们引用了所引用文档的两个版本
NEW
始终填充,它包含文档的最新版本,无论是否进行了更新
OLD
包含文档的旧版本,然后使用新值进行更新。如果文档没有更新,那么它将返回null,因此在这种情况下,它将始终为null,因为更新不会发生
是的,如果在其他数据库语言中不存在样式的命令,那么它将完全按照样式执行。如果比较器不匹配,则插入新记录;如果比较器匹配,则不执行任何操作
我希望这有帮助
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
这将返回现有用户,如果用户不存在,则插入用户。
然后返回用户对象
没有不必要的写入操作您可以创建一个示例查询吗。谢谢你,我的声誉太低,太高了:)当我能做到的时候,我会做的。这个解决方案也是正确的,取决于具体情况,这是唯一可能的