假设我在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
}
我现在需要查明我是否有给定电子邮件地址的文档。但是,我需要查询不区分大小写。
有一些方法可以在字段上搜索不区分大小写(但它们会执行完整扫描):
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个这样的项目,所以我甚至想要获取所有项目并在客户端的内存中进行比较。
答案 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不能使用索引,因此请考虑仅使用其他更具选择性(索引)的条件。