Cosmos DB-不能通过IN关键字

时间:2019-03-29 16:39:59

标签: azure-cosmosdb

我试图使用在第一个文档中找到的一些属性来一次查询多个文档,类似于对属性值的TSQL左联接。

我在CosmosDB中的尝试:

select c from assets
join ver on c.versions
where c.id = '123' OR c.id IN ver.otherIds   
--NOTE: ver.otherIds is an array

上面的查询导致语法错误,表明它不理解ver.otherIdsdocs的语法为where c.id in ("123","456"...)

我尝试解决的问题:

  • 尝试获取数组的自定义UDF会生成所需的语法Ex)["123,"456"] --> "("123", "456")
  • 尝试使用array_contains(ver.otherIds, c.id)
  • 尝试了子查询方法,该方法产生了“标量子查询结果集的基数不能大于一个”的错误:
select value c from c
where array_contains((select ... that produces array), c.id)

以上方法均无效。

我当然可以拉出第一笔资产,然后生成第二条查询以拉出其余资产,但我宁愿不这样做。我还可以对所有数据进行非规范化处理,但是如果不提供具体方案,最终将是一个非常糟糕的主意。

有什么想法吗?

谢谢!

1 个答案:

答案 0 :(得分:1)

您可以使用第二种情况:ARRAY_CONTAINS

我的样本文档:

[
    {
        "id": "1",
        "versions": [
            {
                "otherIds": [
                    "1",
                    "2",
                    "3"
                ]
            }
        ]
    },
    {
        "id": "2",
        "versions": [
            {
                "otherIds": [
                    "1",
                    "2",
                    "3"
                ]
            },
            {
                "otherIds": [
                    "123",
                    "2",
                    "3"
                ]
            }
        ]
    },
    {
        "id": "123",
        "versions": [
            {
                "otherIds": [
                    "1",
                    "2",
                    "3"
                ]
            },
            {
                "otherIds": [
                    "123",
                    "2",
                    "3"
                ]
            }
        ]
    }
]

SQL:

SELECT distinct c.id,c.versions FROM c
join ver in  c.versions
where c.id="123" or array_contains(ver.otherIds,c.id,false)

ARRAY_CONTAINS 函数可以指定匹配是完全匹配还是部分匹配。