Как я могу избежать автоматического принуждения в запросах Couchbase?

Запрос N1QL имеет фильтр WHERE myField < $value.

Экспериментируя, я вижу, что Couchbase упорядочивает типы следующим образом: boolean ‹ integer ‹ string ‹ JsonArray, хотя с моей точки зрения они не должны быть сопоставимы.

Например, любое логическое значение оценивается как меньше любого целого числа; любое целое число меньше всех строк. (9223372036854775807 (Long.MAX_VALUE) меньше "" (пустая строка).)

Я хочу избежать этого принуждения типов. Я хочу, чтобы "A" < 1 и "A" > 1 были false и не возвращали такие значения из фильтра. (А еще кажется, что в Javascript оба эти выражения false, как и должно быть.)

Каковы правила принуждения? Как предотвратить это?


person Joshua Fox    schedule 01.04.2019    source источник


Ответы (1)


Вы обнаружили порядок сортировки N1QL. Вот более полное объяснение:

https://docs.couchbase.com/server/6.0/n1ql/n1ql-language-reference/datatypes.html

Если вы хотите избежать этого сравнения между типами, вы можете добавить предложение, используя функцию TYPE(), чтобы убедиться, что два сравниваемых элемента относятся к одному и тому же типу.

https://docs.couchbase.com/server/6.0/n1ql/n1ql-language-reference/typefun.html

Таким образом, вместо $A > 3 у вас будет ($A > 3) AND (TYPE($A) = TYPE(3)).

person Johan Larson    schedule 01.04.2019
comment
Спасибо. Знаете ли вы причину принуждения типов для сопоставления? Я не могу придумать ни одного варианта использования, где бы хотелось 9223372036854775807‹ - person Joshua Fox; 02.04.2019
comment
Я думаю, что ранние разработчики механизма запросов просто хотели создать общий порядок всех значений. Альтернативой было бы оставить этот вопрос нерешенным, поэтому, если бы ваши результаты содержали целые числа и строки в выражении ORDER BY, целые числа и строки были бы отсортированы, но они могли бы чередоваться любым способом. - person Johan Larson; 02.04.2019
comment
Чтобы расширить точку зрения Йохана, JSON не имеет фиксированной схемы — возможно иметь поле, имеющее тип string в одних документах, целое число в других и объектное значение в других. Определение общего порядка разрешает ORDER BY таких полей. - person EbenH; 02.04.2019
comment
@JohanLarson и ebenH, это имеет смысл для ORDER BY, но я спрашиваю о предложениях WHERE - фильтрах, если я запрашиваю WHERE age ›30; и документ имеет возраст = Foo, я не ожидаю, что объект будет возвращен. - person Joshua Fox; 05.04.2019
comment
forums.couchbase.com/ t/ Буду признателен за любые ответы. Я разместил это на форуме Couchbase, который больше подходит для такого рода дискуссий. - person Joshua Fox; 07.04.2019