首页 > 解决方案 > 用于在数组中搜索的 Cosmos db sql 查询

问题描述

我有一个如下的文档结构

[
    {
        "id": "1",
        "author": "John Smith",
        "partNames": [
            "PART.5",
            "PART.10",
            "PART.15",
            "PART.30",
            "PART.31"
        ]
        ...
    },
    {
        "id": "2",
        "author": "Mike Smith",
        "partNames": [
            "PART.4",
            "PART.6",
            "PART.17",
            "PART.18",
            "PART.20"
        ]
        ...
    }
]

我尝试通过字段作者和partNames实现对用户的搜索,因此用户可以像这样进行查询

SELECT * FROM c WHERE CONTAINS(c.author, 'John')

id=1因为作者的名字是 ,所以用户将得到文档的结果John

下一步是允许用户按部分请求文档,例如我想接收一个PART.4存在的文档,所以查询将是

SELECT * FROM c WHERE ARRAY_CONTAINS(c.partNames, 'PART.4', true)

它返回 document id=2

更进一步,我想进行查询,允许用户输入PART.1,他将收到文档id=1id=2因为两者都有以开头的部分PART.1

那么有没有办法实现呢?

标签: sqlazure-cosmosdb

解决方案


请测试以下sql:

SELECT distinct value c FROM c
join p in c.partNames
where STARTSWITH(p, "PART.1")

结果:

在此处输入图像描述


更新:

Op 更改了一点数组,因为代替了[part.1, part2...]项目,并制作了另一个结构,[ {part: part.1}, {part: part.2} ... ]并设法使用用户定义的函数进行查询,类似于此处描述的DocumentDB SQL with ARRAY_CONTAINS并且它工作正常。


推荐阅读