我已经设法使用 Andrew Liu 建议的用户定义函数找到解决方案,因为 - 正如他所提到的 - 这种 JOIN 方法正在返回叉积,因此每一个匹配都是作为结果给出的。
在我的情况下,我需要确定用户是否有权查看文档 - 通过组分配访问它。每个用户都有他的组列表,每个文档都有一个允许查看其内容的组列表。
对于所描述的示例,假设我们有一个允许组 ["g1","g2","g3"] 的文档和一个可以查看组 ["g1","g3"] 中的文档的用户。
使用我们的 SQL JOIN 方法,当我们查找可用文档时,上述文档将被返回两次。如果 Distinct 函数可用于 DocumentDB,也许我不会关心这一点,但目前它不是(但您仍然可以vote 使用它)。
UDF 是使用 javascript 定义的,因此负责确定两个列表(数组)是否具有共同元素的代码如下所示:
function(array1, array2) {
return array1.some(function (v) {
return array2.indexOf(v) >= 0;
});
}
要从 C# 代码中定义这样的脚本,你可以按照这个 sn-p:
UserDefinedFunction udf =
_client.CreateUserDefinedFunctionQuery(_collection.UserDefinedFunctionsLink)
.Where(x => x.Id == "ArraysHasCommonElem")
.AsEnumerable()
.FirstOrDefault();
if (udf == null)
{
udf = new UserDefinedFunction
{
Body = @"function(array1, array2) {
return array1.some(function (v) {
return array2.indexOf(v) >= 0;
});
}",
Id = "ArraysHasCommonElem"
};
await _client.CreateUserDefinedFunctionAsync(collectionUri.SelfLink, udf);
}
最后运行 SQL 查询,记住每次用户定义函数调用之前需要的“udf”前缀:
SELECT * FROM docs
WHERE udf.ArraysHasCommonElem(your_array1, your_array2)