2016-12-12 28 views
2

我想插入值到阿朗戈-DB通过自定义键,但我并没有在SQL发现了一个“如果不存在”之类的函数“如果不存在”上Arangodb

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 

回答

2

如何看UPSERT命令,并且只给它的命令,并没有为UPDATEINSERT一部分的指令。那样只有它不存在才会执行。

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,所以在这种情况下,它会一直为空,因为更新不会发生。

是的,这完全按照其他数据库语言中的IF NOT EXISTS样式命令执行。如果比较器不匹配,它会插入新记录,如果比较器匹配,它什么都不做!

我希望有帮助!

+0

是否有可能,您可以创建示例查询。它没有为我工作,没有选项。 – ich

+0

谢谢,我的声誉是低,upvote :)当我可以做到这一点,我会做 – ich

0

它的一点点不满意,Arangodb社区帮助了我。它不存在像“IF NOT EXITS”这样的查询,在这种情况下数据库系统抛出一个exeption,为了使查询可用,您必须添加一个忽略错误消息对话框。

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