CosmosDb Mongo-具有分片的集合,通过分片缓慢查询?

问题描述

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

一个客户示例:

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

}

我发现奇怪的是,如果我通过电子邮件查询花费了7000RUs(这太多了-至少是数据浏览器告诉我的...),但是如果我通过CustomerId查询,它花费的大致相同的RU。 ..

我的问题是:

  • 这两个操作的支出RU是否应少于这笔费用,特别是按CustomerId花费?

通过电子邮件进行查询的示例:

{ "Email" : { $eq: "[email protected]" } }

CustomerId查询的示例:

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

一个问题,我的索引同时包含Email和CustomerId。例如,我有什么办法可以通过电子邮件查询并仅返回CustomerId?

解决方法

这两个操作的支出RU是否应少于这笔费用,特别是按CustomerId花费?

CustomerId是您的分片键(也称为分区键),可帮助将具有相同CustomerId值的文档分组以存储在同一逻辑分区中。在对Cosmos进行精确的GET / SET调用期间使用此分组,但在查询期间不使用。因此,您将需要明确地在CustomerId上建立索引。

此外,由于您拥有的索引是CustomerIdEmail上的复合索引,因此一次仅对这些字段之一进行查询将导致执行扫描,以便取回结果。因此,每个查询的RU费用较高且RU费用量相似。

另一个问题,我的索引同时包含Email和CustomerId。例如,我有什么办法可以通过电子邮件查询并仅返回CustomerId?

首先,为了在Email上进行最佳查询,您需要分别在Email上创建索引。之后,您可以使用project feature of Mongo在响应中仅包含某些字段。

类似这样的东西-

find({ "Email" : { $eq: "[email protected]" } },{ "CustomerId":1 })