Использование Python для воспроизведения поведения сортировки документов MongoDB для TinyMongo
Ключевые правила
Направление Варс
ASCENDING = 1 # small -> big DESCENDING = -1 # big -> small
Порядок основных типов данных
[] ASCENDING
None |
Numeric v
String
Dict
List 1d ^
List Nd |
Bool DESCENDING
Чтобы решить, какие данные больше или меньше, сначала отсортируйте данные по типу в указанном выше порядке, а затем сравните значение.
Если результат сортировки равен, то сортировать данные по найденному порядку.
Руководство по MongoDb — Порядок сравнения типов Bson
Составные типы
Список (массив)
Тип списка будет использовать наименьший (по возрастанию) или наибольший (по убыванию) элемент для сравнения с другими данными, поэтому массив будет понижать одно измерение при сортировке, что означает, что одномерный массив будет сортироваться с другими данными того же типа, что и элемент сравнения массива. Если эти наименьшие или наибольшие члены равны, отсортируйте данные по найденному порядку.
ASCENDING : smallest member DESCENDING : largest member
Словарь (объект)
Словарь будет перебирать ключ-значение для сравнения с другим документом типа dict
, сначала по типу данных значения, затем сортируя по ключевой строке, наконец, по значению, переходя к следующему ключу-значению, если результат сортировки равен, сортировать по данным Найдено порядок, если все ключи-значения равны.
valueType_1 -> key_1 -> value_1 -> ... -> valueType_N -> key_N -> value_N
Несуществующие/пустые типы
Нет (Null, NoMatch)
Если значение равно None
или [None]
, сортировка друг друга в порядке найдено. Если поле не найдено, трактовать как None
.
[ ]
Если значение представляет собой пустой список []
, интерпретируется как меньше нуля.
Как
сортировка кортежей
# basic form for comparing (section(int), (type(int), value(*)), index(int))
раздел (внутренний)
Для реализации мультисортировки необходимо предотвратить следующее действие сортировки, переопределяющее последний результат сортировки, путем создания разделов (групп).
Набор документов с одинаковым идентификатором раздела означает, что ключ-значение, которое они имеют в этом действии сортировки, одинаковы.
(тип (число), значение (*))
Для одновременного сравнения с различными типами значений сравнивается весовое значение типа значения перед самим значением.
- [ ] ( меньше нуля )
# weight -1
(-1, [])
- Нет, не соответствует
# weight 0
(0, None)
- Числовой, Строковый, Логический
# weight 1
(1, 3.1415)
# weight 2
(2, "Hello")
# weight 5
(5, True)
- Дикт
# weight 3
(3, (2, "color", "#FF00AA", ..., type-N(int), key-N(str), value-N(*), ...))
- Список
При сравнении с документами:
# Looking for min/max member to compare with other docs
min([(1, 72), ..., (type-N(int), value-N(*)), ...]) # or max
При сравнении с другим списком:
# weight 4, iter all member inside the List
(4, ((1, 72), ..., (type(int), value(*)), ...))
индекс (целое число)
Это не тот документ _id
. Если ключ-значение документа после сортировки совпадают, они будут упорядочены по этому индексу итерации. Этот индекс всегда будет упорядочен по возрастанию.
Полный рабочий код
Результат сортировки должен быть таким же, как у MongoDB.