Я пытаюсь написать запрос, который использует 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
пункт.
Что я здесь не так делаю?