CosmosDb Mongo-带有shardkey的集合,shardkey查询速度慢



我有一个带有Mongodb的CosmosDb集合。这是一个客户数据库,ShardKey实际上是CustomerId。我的收藏有200000条记录,并且有一个电子邮件和customerid的组合索引。

客户示例:

{
"CustomerId" : "6a0f4360-d722-4926-9751-9c7fe6a97cb3",
"FirstName" : "This is my company first name",
"LastName" : "This is my company last name",
"Email" : "6a0f4360-d722-4926-9751-9c7fe6a97cb3@somemail.com",
"Addresses" : [
{
"AddressId" : "54e34da9-55fb-4d60-8411-107985c7382e",
"Door" : "11111",
"Floor" : "99",
"Side" : "B",
"ZipCode" : "8888",
}
]

}

我觉得奇怪的是,如果我通过电子邮件查询,它会花费7000RU(这太多了——至少是数据浏览器告诉的…(,但如果我通过CustomerId查询,它或多或少会花费相同的RU。。。

我的问题是:

  • 两个运营部门的RU支出不是都比这个少吗

电子邮件查询示例:

{ "Email" : { $eq: "3f7da6c3-81bd-4b1d-bfa9-d325388079ab@somemail.com" } }

CustomerId查询示例:

{ "CustomerId" : { $eq: "3f7da6c3-81bd-4b1d-bfa9-d325388079ab" } }

另一个问题是,我的索引同时包含电子邮件和客户ID。例如,我有没有办法通过电子邮件查询并只返回CustomerId?

两项操作的RU开销不是都比这少吗?

CustomerId是您的分片密钥(也称为分区密钥(,它有助于将具有相同CustomerId值的文档分组存储在同一逻辑分区中。此分组在对Cosmos的定点GET/SET调用期间使用,但在查询期间不使用。因此,您需要显式地对CustomerId建立索引。

此外,由于您拥有的索引是CustomerIdEmail的复合索引,因此一次只查询其中一个字段将导致执行扫描以返回结果。因此,在这些查询中的每一个上的高RU费用和相似数量的RU费用。

另一个问题,我的索引同时包含电子邮件和客户ID。例如,我有没有办法通过电子邮件查询并只返回CustomerId?

首先,为了在Email上进行最佳查询,您需要在Email上单独创建一个索引。之后,您可以使用Mongo的project特性在响应中只包含某些字段。

类似这样的东西-

find({ "Email" : { $eq: "3f7da6c3-81bd-4b1d-bfa9-d325388079ab@somemail.com" } }, { "CustomerId":1 })

最新更新