Я хочу получить количество всех документов в выбранном разделе. Однако следующий код вернет количество всех документов в коллекции и стоит 0 RU.

    var collectionLink = UriFactory.CreateDocumentCollectionUri(databaseId, collectionId);

    string command = "SELECT VALUE COUNT(1) FROM Collection c";

    FeedOptions feedOptions = new FeedOptions()
    {
        PartitionKey = new PartitionKey(BuildPartitionKey(contextName, domainName)),
        EnableCrossPartitionQuery = false
    };

    var count = client.CreateDocumentQuery<int>(collectionLink, command, feedOptions)
        .ToList()
        .First();

Добавление предложения WHERE c.partition = 'blah' к запросу будет работать, но стоит 3,71 единицы RU при 11 документах в коллекции.

Почему приведенный выше фрагмент кода должен возвращать счетчик всей коллекции, и есть ли лучшее решение для получения счетчика всех документов в выбранном разделе?

4
Du-z 13 Мар 2018 в 10:03

2 ответа

Лучший ответ

Если запрос включает фильтр по ключу раздела, например SELECT * FROM c WHERE c.city = "Seattle", он направляется в один раздел. Если в запросе нет фильтра по ключу раздела, он выполняется во всех разделах, а результаты объединяются на стороне клиента.

Вы можете проверить логические шаги, выполняемые SDK, из этого официального doc, когда мы отправляем запрос к Azure Cosmos DB.

Если запрос представляет собой агрегацию, например COUNT, счетчики из отдельных секций суммируются для получения общего счета.

Поэтому, когда вы просто используете SELECT VALUE COUNT(1) FROM Collection c, он выполняется во всех разделах, а результаты объединяются на стороне клиента.

Если вы хотите получить количество всех документов в выбранном разделе, просто добавьте фильтр where c.partition = 'XX'.

Надеюсь, это поможет тебе.

1
Jay Gong 13 Мар 2018 в 07:35

Я считаю, что это на самом деле ошибка, поскольку у меня такая же проблема с ключом раздела, установленным как в запросе, так и в FeedOptions.

О подобной проблеме сообщалось здесь: https://github.com/Azure/azure-cosmos-dotnet- версия 2 / issues / 543

И ответ Microsoft звучит так, будто это проблема SDK, специфичная для x64.

0
snakey 30 Сен 2019 в 21:40