Использование 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.