CosmosDB Mongo — сбор с помощью shardkey, медленный запрос с помощью shardkey?

#azure #azure-cosmosdb-mongoapi

#azure #azure-cosmosdb-mongoapi

Вопрос:

У меня есть коллекция CosmosDB с Mongodb. Это база данных клиентов, и ShardKey на самом деле является CustomerID. Моя коллекция насчитывает 200000 записей и имеет комбинированный индекс как электронной почты, так и идентификатора пользователя.

Пример клиента:

 {
"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",
    }
]
  

}

Что я нахожу странным, так это то, что если я запрашиваю по электронной почте, он тратит 7000RUs (что слишком много — по крайней мере, так говорит мне data Explorer …), но если я запрашиваю по CustomerID, он тратит примерно столько же RUs…

Мои вопросы:

  • Не должны ли обе операции тратить меньше RUs, чем это, особенно по идентификатору пользователя?

Пример запроса по электронной почте:

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

Пример запроса с помощью CustomerID:

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

Другой вопрос, мой индекс содержит как адрес электронной почты, так и идентификатор пользователя. Есть ли какой-либо способ для меня запросить по электронной почте и вернуть только CustomerID, например?

Ответ №1:

Не должны ли обе операции тратить меньше RUs, чем это, особенно по идентификатору пользователя?

CustomerId является ли ваш ключ сегмента (он же ключ раздела), который помогает группировать документы с одинаковым значением CustomerID, которые будут храниться в одном логическом разделе. Эта группировка используется во время точечных вызовов GET / SET в Cosmos, но не во время запроса. Итак, вам понадобится индекс на CustomerId явно.

Кроме того, поскольку индекс, который у вас есть, является составным индексом для CustomerId и Email , выполнение запроса только по одному из этих полей одновременно приведет к выполнению сканирования для получения результата. Отсюда высокая плата за RU и аналогичная сумма платы RU за каждый из этих запросов.

Другой вопрос, мой индекс содержит как адрес электронной почты, так и идентификатор пользователя. Есть ли какой-либо способ для меня запросить по электронной почте и вернуть только CustomerID, например?

Во-первых, для оптимального запроса на Email вам нужно будет создать индекс на Email отдельно. После этого вы можете использовать project функцию Mongo для включения только определенных полей в ответ.

Что-то вроде этого-

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