"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 现有用户或插入一个用户(如果不存在)。
然后返回用户对象。
没有不必要的写操作
我想使用自定义键将值插入到 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 现有用户或插入一个用户(如果不存在)。 然后返回用户对象。
没有不必要的写操作