Я пытаюсь получить документы определенного типа. Вот моя первая попытка, основанная на документации:

var dataStoreStatuses = 
  _documentClient.CreateDocumentQuery<DataStoreStatus>(
                    DocumentService.CollectionUri, new FeedOptions() { 
                      EnableCrossPartitionQuery = true })
                 .ToList();

Проблема в том, что этот запрос возвращает даже документы, не соответствующие схеме DataStoreStatus. Я предполагаю, что это то, как это должно работать, поскольку Cosmos Db не имеет схемы (хотя в документации говорится, что DataStoreStatus определяет the type of object to query).

Раньше я использовал RavenDb, и он хранил тип документа, поэтому такие запросы было действительно легко выполнять. Есть ли способ добиться этого в Cosmos Db?

0
SiberianGuy 23 Ноя 2017 в 05:56

1 ответ

Лучший ответ

Как вы уже упоминали, DocumentDB не имеет схемы. Когда в документации говорится, что «DataStoreStatus определяет тип объекта для запроса», тогда я считаю, что вы смотрите на документацию клиентского API. Конкретный аргумент универсального типа на самом деле не является частью запроса, отправляемого в хранилище DocumentDB, но используется в качестве второго шага после выборки документов, чтобы помочь автоматически сопоставить возвращенные документы с типами, которые вы хотите. Последний шаг - чисто клиентская.

Итак, насколько мне известно, вы не можете запрашивать документы по типу с вашим запросом по своей задумке.

Временное решение

Если вам нужно запросить документы по типу, вам необходимо сохранить такую ​​информацию в самих документах. Довольно часто свойство имеет название «тип» или что-то подобное. Затем вы можете сделать запрос:

select * from c where c.type = 'DataStoreStatus'

Обратите внимание, что ваш тип объекта также должен содержать это поле.

2
Imre Pühvel 23 Ноя 2017 в 07:55