#azure-cosmosdb #azure-cosmosdb-sqlapi
#azure-cosmosdb #azure-cosmosdb-sqlapi
Вопрос:
Мне интересно, есть ли какой-либо способ запроса с использованием AltLink, а не SelfLink?
SELECT * FROM c
--WHERE c._alt = 'dbs/DefaultDb/colls/DefaultColl/docs/cd9d67d5-b82e-4ec5-aad3-91e784906f6e'
WHERE c._self = 'dbs/Rr4MAA==/colls/Rr4MAOW90GI=/docs/Rr4MAOW90GIBAAAAAAAAAA==/'
Обновить:
Причина, по которой я ищу способ использования AltLink в SQL, связана с проблемой простого запроса документа по его идентификатору, стоимость которого будет постоянно расти по мере роста коллекции. Где, поскольку .net SDK позволяет использовать AltLink для получения документа, а стоимость почти всегда составляет от 1 до 1,5 RU.
Комментарии:
1. Просто любопытно, зачем вам нужно делать такой запрос. Какую проблему вы пытаетесь решить?
2. Если вы можете выполнить запрос к коллекции, то для поиска документа вам не нужно ничего, кроме идентификатора, поэтому идея ссылки alt на самом деле не имеет смысла, но я, возможно, что-то упускаю
3. Дэвид Макогон, проблема в том, что в моей коллекции 10 000 документов. Если я запрашиваю документы по идентификатору, стоимость RU составляет 277. Если я запрашиваю по самоссылке, стоимость составляет 1,2 RU. Если я запрашиваю по идентификатору документа и типу документа (его перечисление), стоимость RU составляет 2,4. Использование SelfLink и AltLink предположительно является самым быстрым и дешевым способом получения документа.
4. @user6196566 — попробуйте выполнить чтение по идентификатору документа (запросы всегда будут стоить дороже, чем чтение, когда вы знаете идентификатор). Это (чтение) является самым дешевым (RU-wise) для чтения документа. Не запрос.
5. Ник Шапсас, рад тебя слышать! Я прочитал много ваших сообщений о stackoverflow за последние несколько месяцев, поскольку я создавал прототипы в cosmos db. Моя проблема в том, что в .net SDK есть метод с именем ReadDocumentAsync. Этот метод возвращает один документ по его идентификатору. Я не могу заставить эмулятор cosmos возвращать ту же запись так же эффективно. Использование самоссылки кажется самым быстрым, но для использования самоссылки я должен знать, какой пользовательский интерфейс RId ищет. В настоящее время я сохраняю только идентификатор родителей в дочерних документах, а не избавляюсь от родительского.
Ответ №1:
Есть несколько вещей, которые мне нужно прояснить для вас, прежде чем вы сможете понять, почему то, о чем вы просите, не имеет смысла.
Прямое чтение с использованием ссылки self / alt и значения ключа раздела ВСЕГДА будет более эффективным, чем запросы с использованием ссылки self / alt и значения ключа раздела. Просто так работает Cosmos.
Причина, по которой то, что вы запрашиваете, вообще невозможно, заключается в том, что id
значение не является уникальным в коллекции. У вас может быть неограниченное количество элементов с одинаковыми id
значениями, если они находятся в другом логическом разделе (это означает, что ваше id
значение уникально только в пределах своего собственного логического раздела).
Это означает, что в таком сценарии ваш AltLink
for для каждого отдельного документа в коллекции будет точно таким же. Как сервер узнает, какой документ вам действительно нужен? Это также относится к SelfLink
тому, который уникален для каждого документа, поскольку он использует идентификаторы ресурсов. Однако сервер не имеет возможности узнать, где находится этот идентификатор ресурса, если вы не укажете его на логический раздел.
То, что вы должны делать, о чем вы просите, — это использовать Read
методы SDK или Read
метод REST API вместе со значением ключа раздела, которое вы ищете.
Комментарии:
1. Хорошо, просто для ясности. Лучший способ получить родительский и его дочерние элементы — сначала выполнить прямое чтение, чтобы получить родительский документ. Затем выполнение запроса документа для получения бесконечного числа дочерних элементов? Должны ли мы хранить Rid дочерних элементов под родительским, чтобы нам не нужно было запрашивать? Если я подумаю об этом, то 100 документов из запроса стоят около 7 RU, где 100 отдельных операций чтения стоят 100 RU.