Уведомления

Группа в Telegram: @pythonsu

#1 Июль 14, 2017 22:27:53

Vort
Зарегистрирован: 2014-01-09
Сообщения: 14
Репутация: +  0  -
Профиль   Отправить e-mail  

PyMongo: как сохранить исходный порядок ключей во вложенном объекте?

Использую MongoDB вперые и столкнулся с непонятной трудностью.

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

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

https://prnt.sc/fvs0z1

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

Заранее спасибо за ответы.

Отредактировано Vort (Июль 14, 2017 22:29:18)

Прикреплённый файлы:
attachment ttt.JPG (31,3 KБ)

Офлайн

#2 Июль 15, 2017 00:00:02

Rodegast
От: Пятигорск
Зарегистрирован: 2007-12-28
Сообщения: 2679
Репутация: +  182  -
Профиль   Отправить e-mail  

PyMongo: как сохранить исходный порядок ключей во вложенном объекте?

У тебя список словарей. Словари не сортируются.
P.S. В ключах используй только ASCII символы и делай их как можно короче.



С дураками и сектантами не спорю, истину не ищу.
Ели кому-то правда не нравится, то заранее извиняюсь.

Офлайн

#3 Июль 15, 2017 01:06:24

JOHN_16
От: Россия, Петропавловск-Камчатск
Зарегистрирован: 2010-03-22
Сообщения: 3292
Репутация: +  221  -
Профиль   Отправить e-mail  

PyMongo: как сохранить исходный порядок ключей во вложенном объекте?

Vort
никак. Для начала. на скришоте видно что и алфавитного порядка там нет. Визуализация в Robomongo (Robo3T) только будет реализована в алфавитном, и то по жалобам трудящихся, но сами данные хранятся в не сортированном виде. И по другому никак. Так как это по питонячи говоря классический словарь (хэш таблица).



_________________________________________________________________________________
полезный блог о python john16blog.blogspot.com

Офлайн

#4 Июль 15, 2017 10:01:31

Vort
Зарегистрирован: 2014-01-09
Сообщения: 14
Репутация: +  0  -
Профиль   Отправить e-mail  

PyMongo: как сохранить исходный порядок ключей во вложенном объекте?

JOHN_16
Vortникак. Для начала. на скришоте видно что и алфавитного порядка там нет. Визуализация в Robomongo (Robo3T) только будет реализована в алфавитном, и то по жалобам трудящихся, но сами данные хранятся в не сортированном виде. И по другому никак. Так как это по питонячи говоря классический словарь (хэш таблица).
Да, алфавитного порядка в монго нет, и это то, что мне нужно. Чтобы сохранить нужный мне порядок, выборка из MySQL делается через OrderedDict и он же потом передаётся в mongo. Ещё не вникал в тонкости реализации PyMongo, но вижу, что нужный мне порядок ключей вложенных объектов сохраняется.
Беда происходит непосредственно при выборке из mongo, я отчетливо вижу в дебаггере, что порядок ключей сортируется в алфавитном порядке, сначала латиносимвольные, и далее кириллические (да, это плохо, но исходя из задачи - нет выбора).
Вот и хотелось бы чтоб эту сортировку монго или драйвер не делали.

Офлайн

#5 Июль 15, 2017 15:16:33

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 4138
Репутация: +  252  -
Профиль   Отправить e-mail  

PyMongo: как сохранить исходный порядок ключей во вложенном объекте?

Уважаемый Vort вы похоже не читаете то что вам пишут:

JOHN_16
сами данные хранятся в не сортированном виде
Те никакого порядка не гарантируется. Вы засунете еще один элемент в хвост, при запросе он имеет право выйти первым или в середине. Вполне может быть что они вначале будут сохранять порядок добавления, а на сотом добавлении все перемешаются и т. п.
Vort
Чтобы сохранить нужный мне порядок, выборка из MySQL делается через OrderedDict
Позвольте поинтересоваться что вы предприняли чтобы сохранить заданный порядок записей в MySQL?
Можно увидеть строку запроса к базе?



Отредактировано doza_and (Июль 15, 2017 15:18:29)

Офлайн

#6 Июль 15, 2017 18:29:23

Vort
Зарегистрирован: 2014-01-09
Сообщения: 14
Репутация: +  0  -
Профиль   Отправить e-mail  

PyMongo: как сохранить исходный порядок ключей во вложенном объекте?

doza_and
Уважаемый Vort вы похоже не читаете то что вам пишут:
Я читаю, и спасибо за попытки помочь и вразумить, ))
Но:
Я верю (я уже пытался рыть документацию и читал о sort), что порядок вставки объектов не сортируется. И в каком порядке объекты сущностей сохраняются, мне не принципиально.
Речь о ключах вложенного объекта. При вытаскивании из MySQL поля сохраняются, как уже сказал в OrderedDict. Не совсем понял, что Вы имеете ввиду под заданным порядком в MySQL? В каком порядке я алиасы развесил?
Дело вот в чем: я в дебаггере вижу, что при сохранении объектов в mongo (их порядка 1300, идентичных по структуре), порядок тектосвых ключей во вложенном объекте сохранен, согласно исходному OrderedDict. Во всех 1300. И в итоге в монго этот порядок не теряется.
Но при выводе, сразу после find, прилетают уже объекты с отсортированными ключами. Все. Одинаково по алфавиту.

P.S. Запрос могу показать, он на 1.5 страницы, оно Вам надо? И чем поможет в этом аспекте? )

Офлайн

#7 Июль 15, 2017 18:38:40

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

PyMongo: как сохранить исходный порядок ключей во вложенном объекте?

Vort
1300 объектов это вообще пустяки. Почему для вас важно сортировать данные именно при запросе инструментами БД? Сортируйте их питоном после получения.



Офлайн

#8 Июль 15, 2017 18:49:31

Vort
Зарегистрирован: 2014-01-09
Сообщения: 14
Репутация: +  0  -
Профиль   Отправить e-mail  

PyMongo: как сохранить исходный порядок ключей во вложенном объекте?

FishHook
Vort1300 объектов это вообще пустяки. Почему для вас важно сортировать данные именно при запросе инструментами БД? Сортируйте их питоном после получения.
На этапе разработки я искусственно ограничил их количество )
Да, пока так и делаю. Но надеялся, что есть путь отменить эту сортировку в mongo.

Офлайн

#9 Июль 15, 2017 20:30:00

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 4138
Репутация: +  252  -
Профиль   Отправить e-mail  

PyMongo: как сохранить исходный порядок ключей во вложенном объекте?

Vort
Речь о ключах вложенного объекта.
Возможно я не совсем вас понимаю.

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

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

p.s.
а способа отмены сортировки не существует, просто потому что данные не отсортированы.



Отредактировано doza_and (Июль 15, 2017 20:31:50)

Офлайн

#10 Апрель 24, 2020 22:49:52

Jony1990
Зарегистрирован: 2020-04-24
Сообщения: 12
Репутация: +  -1  -
Профиль   Отправить e-mail  

PyMongo: как сохранить исходный порядок ключей во вложенном объекте?

Это тебе надо попробовать сделать на Ui , там должен заработать )

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version