#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 })