Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/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
Marklogic 如何确保元素值的唯一性?_Marklogic_Marklogic 9 - Fatal编程技术网

Marklogic 如何确保元素值的唯一性?

Marklogic 如何确保元素值的唯一性?,marklogic,marklogic-9,Marklogic,Marklogic 9,我们使用MarkLogic Server存储一些操作应用程序数据,一个基本要求通常是某些元素值在数据库中的所有文档中都是唯一的(例如,应该允许用户更改的电子邮件地址,但在数据库中的所有用户中都应该是唯一的)。有没有办法让MarkLogic Server确保这种唯一性约束,而不管数据库是如何写入的(即使用XQuery、ReST或XCC)?我们希望避免检查每个应用程序的唯一性,因为这可能不安全,而且很难正确执行。对于这种情况,我通常使用预提交触发器。它会稍微减慢接收速度,但在某些检查不满足时,它可以

我们使用MarkLogic Server存储一些操作应用程序数据,一个基本要求通常是某些元素值在数据库中的所有文档中都是唯一的(例如,应该允许用户更改的电子邮件地址,但在数据库中的所有用户中都应该是唯一的)。有没有办法让MarkLogic Server确保这种唯一性约束,而不管数据库是如何写入的(即使用XQuery、ReST或XCC)?我们希望避免检查每个应用程序的唯一性,因为这可能不安全,而且很难正确执行。

对于这种情况,我通常使用预提交触发器。它会稍微减慢接收速度,但在某些检查不满足时,它可以很好地阻止插入。在这种情况下,只需抛出一个错误(通过调用
fn:error
),更新就会回滚

要实际检查某个值是否尚未使用,您需要进行搜索(例如使用
cts:search
或词典查找(例如使用
cts:values

您可以在伪uri(包括元素名称和值)上使用
xdmp:lock for update
,以确保只有一个并发线程可以同时写入该值。其他线程将等待或重新启动,并注意该值已被获取。您真正需要的只是用于高速摄取

不过,后者会导致争用,因此如果许多并发线程试图声明相同的唯一值,那么摄取可能会减慢速度


HTH!

您需要进行某种检查。正如您所说,在服务器端执行检查比在客户端执行检查更有意义

有很多方法可以做到这一点。以下是一些建议:

1) 将地址合并到URI结构中,并且不授予数据上传者文档更新权限

创建一个URI结构,如:/data/normalizeddress.xml

不要为上载用户可以拥有的文档分配更新权限

如果您尝试上载已使用该URI的文档,服务器将抛出一个错误,您无法更新现有文档

确保URI是使用诸如转换或自定义端点之类的东西在服务器端而不是客户端构建的

2) 使用cts:search或其他变量查看该地址是否已存在于其他文档中,如果已存在,则抛出错误