针对CosmosDB / DocumentDB的数组中不区分大小写的搜索

时间:2017-12-01 15:24:30

标签: azure azure-cosmosdb

假设我在CosmosDB中有这些文档。 (DocumentDB API,.NET SDK)

{
    // partition key of the collection
    "userId" : "0000-0000-0000-0000",
    "emailAddresses": [
        "someaddress@somedomain.com", "Another.Address@someotherdomain.com"
    ]
    // some more fields
}

我现在需要查明我是否有给定电子邮件地址的文档。但是,我需要查询不区分大小写。

有一些方法可以在字段上搜索不区分大小写(但它们会执行完整扫描):

ClickOnce Deployment

select * from json j where LOWER(j.name) = 'timbaktu'
e => e.Id.ToLower() == key.ToLower()

这些不适用于数组。还有另一种方法吗?用户定义的函数看起来可能有所帮助。

我主要是寻找支持该场景的临时省力解决方案(我有多个这样的集合)。我可能需要在某些时候切换到这样的数据结构:

{
    "userId" : "0000-0000-0000-0000",
    // Option A
    "emailAddresses": [
        {
            "displayName": "someaddress@somedomain.com",
            "normalizedName" : "someaddress@somedomain.com"
        },
        {
            "displayName": "Another.Address@someotherdomain.com",
            "normalizedName" : "another.address@someotherdomain.com"
        }
    ],
    // Option B
    "emailAddressesNormalized": {
        "someaddress@somedomain.com", "another.address@someotherdomain.com"
    }
}

不幸的是,我的生产数据库已经包含需要更新以支持新结构的文档。 我的生产集合中只包含100个这样的项目,所以我甚至想要获取所有项目并在客户端的内存中进行比较。

1 个答案:

答案 0 :(得分:1)

如果性能很重要,那么您应该考虑自己提出的标准化解决方案之一。然后,您可以索引标准化字段并在不进行完整扫描的情况下获得结果。

如果由于某种原因你真的不想修饰文件,那么你可能缺少的功能就是简单的连接?

示例查询将使用扫描从数组中进行不区分大小写的搜索:

SELECT c FROM c
join email in c.emailAddresses
where lower(email) = lower('ANOTHER.ADDRESS@someotherdomain.com')

您可以找到有关从Getting started with SQL commands in Cosmos DB加入的更多示例。

请注意,给定示例中的where-criteria不能使用索引,因此请考虑仅使用其他更具选择性(索引)的条件。