Найти - Пользователи
Полная версия: PyMongo: как сохранить исходный порядок ключей во вложенном объекте?
Начало » Базы данных » PyMongo: как сохранить исходный порядок ключей во вложенном объекте?
1
Vort
Использую MongoDB вперые и столкнулся с непонятной трудностью.

Из MySQL при помощи довольно тяжелых запросов, достаются массивы данных и складываются в mongo. И порядок column в результате важен.
В mongo я сохраняю данные именно в этом порядке, с точки зрения структуры, это объект, с массивом вложенных объектов.

Но при доставании данных через find, полученный вложенный объект отсортирован по ключам в алфавитном порядке. Причем сохраняется он в правильном порядке, сортировка судя по всему по-умолчанию, именно при получении.

https://prnt.sc/fvs0z1

Можно ли каким-то образом игнорировать ее и доставать объекты as is?

Заранее спасибо за ответы.
Rodegast
У тебя список словарей. Словари не сортируются.
P.S. В ключах используй только ASCII символы и делай их как можно короче.
JOHN_16
Vort
никак. Для начала. на скришоте видно что и алфавитного порядка там нет. Визуализация в Robomongo (Robo3T) только будет реализована в алфавитном, и то по жалобам трудящихся, но сами данные хранятся в не сортированном виде. И по другому никак. Так как это по питонячи говоря классический словарь (хэш таблица).
Vort
JOHN_16
Vortникак. Для начала. на скришоте видно что и алфавитного порядка там нет. Визуализация в Robomongo (Robo3T) только будет реализована в алфавитном, и то по жалобам трудящихся, но сами данные хранятся в не сортированном виде. И по другому никак. Так как это по питонячи говоря классический словарь (хэш таблица).
Да, алфавитного порядка в монго нет, и это то, что мне нужно. Чтобы сохранить нужный мне порядок, выборка из MySQL делается через OrderedDict и он же потом передаётся в mongo. Ещё не вникал в тонкости реализации PyMongo, но вижу, что нужный мне порядок ключей вложенных объектов сохраняется.
Беда происходит непосредственно при выборке из mongo, я отчетливо вижу в дебаггере, что порядок ключей сортируется в алфавитном порядке, сначала латиносимвольные, и далее кириллические (да, это плохо, но исходя из задачи - нет выбора).
Вот и хотелось бы чтоб эту сортировку монго или драйвер не делали.
doza_and
Уважаемый Vort вы похоже не читаете то что вам пишут:
JOHN_16
сами данные хранятся в не сортированном виде
Те никакого порядка не гарантируется. Вы засунете еще один элемент в хвост, при запросе он имеет право выйти первым или в середине. Вполне может быть что они вначале будут сохранять порядок добавления, а на сотом добавлении все перемешаются и т. п.
Vort
Чтобы сохранить нужный мне порядок, выборка из MySQL делается через OrderedDict
Позвольте поинтересоваться что вы предприняли чтобы сохранить заданный порядок записей в MySQL?
Можно увидеть строку запроса к базе?
Vort
doza_and
Уважаемый Vort вы похоже не читаете то что вам пишут:
Я читаю, и спасибо за попытки помочь и вразумить, ))
Но:
Я верю (я уже пытался рыть документацию и читал о sort), что порядок вставки объектов не сортируется. И в каком порядке объекты сущностей сохраняются, мне не принципиально.
Речь о ключах вложенного объекта. При вытаскивании из MySQL поля сохраняются, как уже сказал в OrderedDict. Не совсем понял, что Вы имеете ввиду под заданным порядком в MySQL? В каком порядке я алиасы развесил?
Дело вот в чем: я в дебаггере вижу, что при сохранении объектов в mongo (их порядка 1300, идентичных по структуре), порядок тектосвых ключей во вложенном объекте сохранен, согласно исходному OrderedDict. Во всех 1300. И в итоге в монго этот порядок не теряется.
Но при выводе, сразу после find, прилетают уже объекты с отсортированными ключами. Все. Одинаково по алфавиту.

P.S. Запрос могу показать, он на 1.5 страницы, оно Вам надо? И чем поможет в этом аспекте? )
FishHook
Vort
1300 объектов это вообще пустяки. Почему для вас важно сортировать данные именно при запросе инструментами БД? Сортируйте их питоном после получения.
Vort
FishHook
Vort1300 объектов это вообще пустяки. Почему для вас важно сортировать данные именно при запросе инструментами БД? Сортируйте их питоном после получения.
На этапе разработки я искусственно ограничил их количество )
Да, пока так и делаю. Но надеялся, что есть путь отменить эту сортировку в mongo.
doza_and
Vort
Речь о ключах вложенного объекта.
Возможно я не совсем вас понимаю.

Все вроде элементарно. Если важен порядок - сохраняйте в документе MongoDB не словарь а список пар. Тогда порядок будет гарантированно сохраняться.

Насколько я понимаю тоже самое касается и MySQL. Если там в запросе нет orderedby или аналогичных конструкций то OrderedDict вам никак не поможет, поскольку база имеет право сама выбирать порядок извлечения данных. Если вы будете на него полагаться не обеспечив, то ваша программа будет нещадно глючить в самые неудачные моменты. Собственно поэтому и было интересно посмотреть запрос.

p.s.
а способа отмены сортировки не существует, просто потому что данные не отсортированы.
Jony1990
Это тебе надо попробовать сделать на Ui , там должен заработать )
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB