Cosmos: ОТЛИЧНЫЕ результаты с JOIN и ORDER BY - PullRequest
2 голосов
/ 06 марта 2019

Я пытаюсь написать запрос, который использует JOIN для выполнения геопространственного сопоставления с местоположениями в массиве.Я получил это работает, но добавил DISTINCT для того, чтобы удалить дубликаты ( Запрос A ):

SELECT DISTINCT VALUE
    u
FROM
    u
JOIN loc IN u.locations
WHERE
    ST_WITHIN(
        {'type':'Point','coordinates':[loc.longitude,loc.latitude]},
        {'type':'Polygon','coordinates':[[[-108,-43],[-108,-40],[-110,-40],[-110,-43],[-108,-43]]]})

Однако затем я обнаружил, что объединение DISTINCT с токенами продолжения нене поддерживается, если вы не добавите ORDER BY:

System.ArgumentException: Distict query requires a matching order by in order to return a continuation token. If you would like to serve this query through continuation tokens, then please rewrite the query in the form 'SELECT DISTINCT VALUE c.blah FROM c ORDER BY c.blah' and please make sure that there is a range index on 'c.blah'. 

Поэтому я попытался добавить ORDER BY следующим образом ( Запрос B ):

SELECT DISTINCT VALUE
    u
FROM
    u
JOIN loc IN u.locations
WHERE
    ST_WITHIN(
        {'type':'Point','coordinates':[loc.longitude,loc.latitude]},
        {'type':'Polygon','coordinates':[[[-108,-43],[-108,-40],[-110,-40],[-110,-43],[-108,-43]]]})
ORDER BY
    u.created

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

Чтобы воспроизвести это, создайте один документ с этими данными:

{
    "id": "b6dd3e9b-e6c5-4e5a-a257-371e386f1c2e",
    "locations": [
        {
            "latitude": -42,
            "longitude": -109
        },
        {
            "latitude": -42,
            "longitude": -109
        }
    ],
    "created": "2019-03-06T03:43:52.328Z"
}

Затем запустите Запрос A выше.Вы получите один результат, несмотря на то, что оба местоположения соответствуют предикату.Если вы удалите DISTINCT, вы получите один и тот же документ дважды.

Теперь запустите Запрос B , и вы увидите, что он возвращает один и тот же документ дважды, несмотря на DISTINCTпункт.

Что я здесь не так делаю?

1 Ответ

0 голосов
/ 07 марта 2019

Воспроизведенная вами проблема действительно, на основании моих исследований, кажется, что это ошибка в запросе cosmos db distinct.Пожалуйста, обратитесь по этой ссылке: Обеспечить поддержку DISTINCT .

Эта функция не работает в проводнике данных.Поскольку космос может возвращать только 100 результатов на страницу за раз, отдельное ключевое слово будет применяться только к одной странице.Таким образом, если ваш набор результатов содержит более 100 результатов, вы все равно можете получить дубликаты обратно - они будут просто на отдельных постраничных наборах результатов.

Вы можете описать свою собственную ситуацию и проголосовать за этот случай обратной связи..

...