Структура документа pymongo insert_one потеряна

У меня есть приложение Python3, которое вставляет информацию о фильме в серверную часть mongodb (MongoDB Compass), и отдельное приложение nodejs, которое ее возвращает. это работало нормально, однако я очистил БД и повторно запустил приложение, теперь, когда я вставляю документ с insert_one, возвращаемая структура всегда теряется:

query = { "Name": name, "Year": year, "Format": definition, "Extension": extension, "Filepath": filepath, "MD5Hash": filehash, "Subtitles": subtitles, "Date": date, "FileSize": size } result = db.Movies_test.insert_one(query)



Первый запуск вернул данные:

_id: 5b1470da91cb5a2240c57c43 Extension: "mkv" Format: "1080p" Filepath: "E:\Movies\10 Cloverfield Lane [2016] 1080p.mkv" Year: "2016" FileSize: 2953397031 MD5Hash: "baf1b857c3f2f4fe6d08161e814a64c2" Date: 2018-06-03 23:51:06.503 Subtitles: false Name: "10 Cloverfield Lane" UpdateTime: 2018-06-04 00:42:51.141

второй прогон вернул данные:

_id: 5b80322f91cb5a05a809a70f Year: "2016" FileSize: 2953397031 Format: "1080p" Filepath: "E:\Movies\10 Cloverfield Lane [2016] 1080p.mkv" Date: 2018-08-24 17:28:31.067 Name: "10 Cloverfield Lane" Extension: "mkv" MD5Hash: "" Subtitles: false

Я заметил здесь похожий вопрос: Структура {$ t: «», $ v: «»} в коллекциях MongoDB с использованием pymongo, однако решения нет, пользователь просто переключился на использование DocumentDB.

Я читал, что у insert есть дополнительная опция insert(query, {'ordered': True}), но она также не сохраняет структуру данных:

_id: 5b80373691cb5a10c42c5906 Subtitles: false Format: "1080p" FileSize: 2953397031 Extension: "mkv" Date: 2018-08-24 17:49:58.160 Name: "10 Cloverfield Lane" MD5Hash: "" Filepath: "E:\Movies\10 Cloverfield Lane [2016] 1080p.mkv" Year: "2016"

Любая помощь была бы замечательной, и в идеале я бы предпочел вставить в исходный порядок запроса вместо обработки вывода, когда он выходит из nodejs.

Почему здесь важен порядок полей документа?

Oluwafemi Sule 25.08.2018 16:13

@OluwafemiSule, как указано, возвращенный документ добавляется к таблице, в идеале я хотел бы сохранить структуру такой же, чтобы мне не приходилось каждый раз перестраивать таблицы (как я уже сказал, когда я уничтожил базу данных и перестроил ее , структура меняется). Мне удалось обойтись, перестроив запрос перед добавлением в таблицу, но я бы предпочел не делать этого.

JONAS402 25.08.2018 17:14

AFAICT, драйвер mongo python предсказуемо возвращает поля документа, упорядоченные по мере их написания. Мне не удалось воспроизвести это поведение с помощью пимонго. Я думаю, что эта проблема может быть связана с драйвером узла.

Oluwafemi Sule 25.08.2018 18:10

Странно, мой запрос python insert_one выполнялся каждый раз одинаково, но создавал разные структуры в mongo compass, поэтому я не думаю, что это проблема nodeJs. Можете ли вы подтвердить, что выполнение запроса на вставку, уничтожение этой базы данных и повторный запуск создают каждый раз одну и ту же структуру? Как это не для меня!

JONAS402 25.08.2018 18:46

Я попробовал и сделал суть. К сожалению, я не получил таких же результатов, как вы. Может быть, вы хотите посмотреть, как компас показывает результаты.

Oluwafemi Sule 25.08.2018 19:44

@OluwafemiSule Я попробовал вашу суть, у меня тоже отлично работает ... Я только что заметил хеш на 1-м наборе возвращенных данных, которые я опубликовал. Я помню, что теперь у меня есть вторая функция хеширования, которая хеширует и добавляет поле updateTime. Мне интересно, действительно ли это изменило структуру документа. Виноват! Но если резюмировать, документы сохраняют структуру при вставке по умолчанию?

JONAS402 25.08.2018 20:42

Возможно, вы поделитесь функцией хеширования в своем вопросе, и мы сможем выяснить, вызывает ли она такой эффект. Чтобы ответить на ваш вопрос об упорядочивании, не так много тестов, чтобы показать, что это верно каждый раз, когда порядок полей сохраняется. Я предполагаю, что, поскольку словари сохраняют порядок полей в python3, это должно быть так.

Oluwafemi Sule 27.08.2018 20:36

@OluwafemiSule, поэтому соответствующей строкой будет result = db.Movies.find_one_and_update({"_id": document['_id']}, {"$set": {"MD5Hash": md5, "UpdateTime": update_time}}, return_document=ReturnDocument.AFTER). Я не вижу ничего, что могло бы изменить структуру. Мое исправление заключалось в том, чтобы отредактировать оператор в узле перед отправкой его обратно в таблицу, это не так уж и плохо. Но все же было бы неплохо узнать, в чем дело!

JONAS402 27.08.2018 20:59
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
8
259
0

Другие вопросы по теме