Проблема с предложением Cosmos db OFFSET LIMIT - PullRequest
0 голосов
/ 14 июля 2020

Я запрашиваю Cosmos DB с помощью REST API. У меня проблемы с предложением OFFSET LIMIT. Я тестировал это как с моим кодом (Dart), так и с Postman с одинаковыми результатами:

  1. Этот запрос работает нормально:

    SELECT * FROM Faults f WHERE CONTAINS(f.Key, 'start', true)
    
  2. Этот запрос не работает. То же, что и 1, но с использованием OFFSET и LIMIT для получения подмножества:

    SELECT * FROM Faults f 
    WHERE CONTAINS(f.Key, 'start', true) 
    OFFSET 10 LIMIT 10
    
  3. Этот запрос работает нормально. То же, что и 2., но с дополнительным фильтром

    SELECT * FROM Faults f 
    WHERE CONTAINS(f.Key, 'start', true) 
      AND f.Node = 'XI' 
    OFFSET 10 LIMIT 10
    

Я не понимаю, почему, если 1 и 3 работают, 2 не работает.

Это ответ из запроса 2:

{
    "code": "BadRequest",
    "message": "The provided cross partition query can not be directly served by the gateway. This is a first chance (internal) exception that all newer clients will know how to handle gracefully. This exception is traced, but unless you see it bubble up as an exception (which only happens on older SDK clients), then you can safely ignore this message.\r\nActivityId: 5918ae0e-71ab-48a4-aa20-edd8427fe21f, Microsoft.Azure.Documents.Common/2.11.0",
    "additionalErrorInfo": "{\"partitionedQueryExecutionInfoVersion\":2,\"queryInfo\":{\"distinctType\":\"None\",\"top\":null,\"offset\":10,\"limit\":10,\"orderBy\":[],\"orderByExpressions\":[],\"groupByExpressions\":[],\"groupByAliases\":[],\"aggregates\":[],\"groupByAliasToAggregateType\":{},\"rewrittenQuery\":\"SELECT *\\nFROM Faults AS f\\nWHERE CONTAINS(f.Key, \\\"start\\\", true)\\nOFFSET 0 LIMIT 20\",\"hasSelectValue\":false},\"queryRanges\":[{\"min\":\"\",\"max\":\"FF\",\"isMinInclusive\":true,\"isMaxInclusive\":false}]}"
}

Спасибо за вашу помощь

Ответы [ 2 ]

1 голос
/ 15 июля 2020

Похоже, вы не можете выполнить запрос между разделами через REST API.

Вероятно, вам придется использовать официальные SDK.

Cosmos DB: запрос между разделами может не обслуживаются напрямую шлюзом

0 голосов
/ 19 июля 2020

Спасибо, приманка, что направил меня в правильном направлении. OFFSET LIMIT - не поддерживается REST API . Однако разбиение на страницы может быть достигнуто с помощью заголовков без использования SDK.

Установите при первом запросе:

  • x-ms-max-item-count на количество записей, которые вы хотите получать за раз, например 10.

В ответе вы получаете заголовок:

  • x-ms-continuation Строка, которая указывает на следующий документ.

Чтобы получить следующие 10 документов отправляют новый запрос с заголовками:

  • x-ms-max-item-count = 10. Точно так же, как и первый.
  • x-ms-continuation установлено значение, полученное вами из ответ.

Таким образом, очень легко получить следующие документы, но не так просто получить предыдущие. Мне пришлось сохранить документ nº и строки «x-ms-continue» как пары «ключ-значение» и использовать их для реализации разбиения на страницы «предыдущий поиск». Не знаю, есть ли способ попроще.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...