Sql 带有数组的DocumentDB查询
我有一个简单的字符串数组属性的文档Sql 带有数组的DocumentDB查询,sql,arrays,azure-cosmosdb,Sql,Arrays,Azure Cosmosdb,我有一个简单的字符串数组属性的文档 { "id": "one", "tags": ["A", "B"] } { "id": "two", "tags": ["A", "C"] } 为了检查,如果值是数组的一部分,我可以使用array\u CONTAINS SELECT * FROM c WHERE ARRAY_CONTAINS(c.tags, "B") 将返回文档1 如何在数组中查询具有可能值列表的文档 返回标记数组中至少有一个值为INB、C的所有文
{
"id": "one",
"tags": ["A", "B"]
}
{
"id": "two",
"tags": ["A", "C"]
}
为了检查,如果值是数组的一部分,我可以使用array\u CONTAINS
SELECT * FROM c WHERE ARRAY_CONTAINS(c.tags, "B")
将返回文档1
如何在数组中查询具有可能值列表的文档
返回标记数组中至少有一个值为INB、C的所有文档。
->文档一和文档二您可以将用于形成嵌套数组元素的叉积的联接运算符与IN运算符组合
SELECT docs
FROM docs
JOIN tags IN docs.tags
WHERE tags IN ("B", "C")
请注意,因为您正在创建一个叉积,所以您将获得每个匹配子元素的结果,而不是每个文档的结果
或者,您可以将多个数组包含与OR运算符组合,或者编写一个UDF。我已经设法使用Andrew Liu建议的用户定义函数来实现解决方案,因为正如他所提到的,这种连接方法返回的是叉积,因此每个匹配都会作为结果给出 在我的例子中,我需要确定用户是否有权查看该文档-它是通过组分配来访问的。每个用户都有自己的组列表,每个文档都有允许查看其内容的组列表 例如,假设我们有一个允许组[g1,g2,g3]的文档和一个可以在组[g1,g3]中查看文档的用户 使用我们的SQLJOIN方法,当我们查找可用文档时,上面描述的文档将返回两次。如果DocumentDB可以使用Distinct函数,也许我不会关心这个问题,但目前不是,但您仍然可以使用它 UDF是使用javascript定义的,因此负责确定两个列表数组是否具有公共元素的代码如下所示:
function(array1, array2) {
return array1.some(function (v) {
return array2.indexOf(v) >= 0;
});
}
要从C代码中定义此类脚本,可以按照以下代码段进行操作:
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);
}
最后,要在每次用户定义函数调用之前运行有关“udf”前缀的SQL查询记忆,请执行以下操作:
SELECT * FROM docs
WHERE udf.ArraysHasCommonElem(your_array1, your_array2)
非常感谢。这几乎解决了问题。否*用于联接查询,而不是[]Oops-修复了查询:now distinct函数可用,您可以从中选择distinct docs…供任何人参考,如果您不希望逻辑耦合到特定集合UDF与集合一起使用,则可以使用distinct函数进行调优-