gpt4 book ai didi

azure - CosmosDB/DocumentDB 数组中不区分大小写的搜索

转载 作者:行者123 更新时间:2023-12-02 23:46:55 24 4
gpt4 key购买 nike

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

{
// partition key of the collection
"userId" : "0000-0000-0000-0000",
"emailAddresses": [
"<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="34475b59515550504651474774475b5951505b59555d5a1a575b59" rel="noreferrer noopener nofollow">[email protected]</a>", "Anoth<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="dfbaadf19ebbbbadbaacac9facb0b2bab0abb7baadbbb0b2beb6b1f1bcb0b2" rel="noreferrer noopener nofollow">[email protected]</a>"
]
// some more fields
}

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

有多种方法可以在字段上搜索不区分大小写的内容(但是它们会进行完整扫描):

How to do a Case Insensitive search on Azure DocumentDb?

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

这些不适用于数组。还有其他方法吗?用户定义的函数看起来会有所帮助。

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

{
"userId" : "0000-0000-0000-0000",
// Option A
"emailAddresses": [
{
"displayName": "<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="82f1edefe7e3e6e6f0e7f1f1c2f1edefe7e6edefe3ebecace1edef" rel="noreferrer noopener nofollow">[email protected]</a>",
"normalizedName" : "<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="186b77757d797c7c6a7d6b6b586b77757d7c7775797176367b7775" rel="noreferrer noopener nofollow">[email protected]</a>"
},
{
"displayName": "<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="b9f8d7d6cdd1dccb97f8ddddcbdccacaf9cad6d4dcd6cdd1dccbddd6d4d8d0d797dad6d4" rel="noreferrer noopener nofollow">[email protected]</a>",
"normalizedName" : "<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="1c7d72736874796e327d78786e796f6f5c6f737179736874796e7873717d7572327f7371" rel="noreferrer noopener nofollow">[email protected]</a>"
}
],
// Option B
"emailAddressesNormalized": {
"someaddress@somedomain.com", "<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="9afbf4f5eef2ffe8b4fbfefee8ffe9e9dae9f5f7fff5eef2ffe8fef5f7fbf3f4b4f9f5f7" rel="noreferrer noopener nofollow">[email protected]</a>"
}
}

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

最佳答案

如果性能很重要,那么您应该考虑您自己提出的有问题的标准化解决方案之一。然后,您可以索引标准化字段并获得结果,而无需进行全面扫描。

如果由于某种原因您确实不想修改文档,那么您可能缺少的功能是简单连接?

示例查询将通过扫描从数组内执行不区分大小写的搜索:

SELECT c FROM c
join email in c.emailAddresses
where lower(email) = lower('<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="44050a0b100c01166a0500001601171704372b29212b302c2136202b29252d2a6a272b29" rel="noreferrer noopener nofollow">[email protected]</a>')

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

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

关于azure - CosmosDB/DocumentDB 数组中不区分大小写的搜索,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47596474/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com