Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
&引用;“如果不存在”;关于Arangodb_Arangodb_Aql_Arangojs - Fatal编程技术网

&引用;“如果不存在”;关于Arangodb

&引用;“如果不存在”;关于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"

我想用自定义键将值插入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"
     } 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
这将返回现有用户,如果用户不存在,则插入用户。 然后返回用户对象


没有不必要的写入操作

您可以创建一个示例查询吗。谢谢你,我的声誉太低,太高了:)当我能做到的时候,我会做的。这个解决方案也是正确的,取决于具体情况,这是唯一可能的