У меня есть приложение 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.
@OluwafemiSule, как указано, возвращенный документ добавляется к таблице, в идеале я хотел бы сохранить структуру такой же, чтобы мне не приходилось каждый раз перестраивать таблицы (как я уже сказал, когда я уничтожил базу данных и перестроил ее , структура меняется). Мне удалось обойтись, перестроив запрос перед добавлением в таблицу, но я бы предпочел не делать этого.
AFAICT, драйвер mongo python предсказуемо возвращает поля документа, упорядоченные по мере их написания. Мне не удалось воспроизвести это поведение с помощью пимонго. Я думаю, что эта проблема может быть связана с драйвером узла.
Странно, мой запрос python insert_one выполнялся каждый раз одинаково, но создавал разные структуры в mongo compass, поэтому я не думаю, что это проблема nodeJs. Можете ли вы подтвердить, что выполнение запроса на вставку, уничтожение этой базы данных и повторный запуск создают каждый раз одну и ту же структуру? Как это не для меня!
Я попробовал и сделал суть. К сожалению, я не получил таких же результатов, как вы. Может быть, вы хотите посмотреть, как компас показывает результаты.
@OluwafemiSule Я попробовал вашу суть, у меня тоже отлично работает ... Я только что заметил хеш на 1-м наборе возвращенных данных, которые я опубликовал. Я помню, что теперь у меня есть вторая функция хеширования, которая хеширует и добавляет поле updateTime. Мне интересно, действительно ли это изменило структуру документа. Виноват! Но если резюмировать, документы сохраняют структуру при вставке по умолчанию?
Возможно, вы поделитесь функцией хеширования в своем вопросе, и мы сможем выяснить, вызывает ли она такой эффект. Чтобы ответить на ваш вопрос об упорядочивании, не так много тестов, чтобы показать, что это верно каждый раз, когда порядок полей сохраняется. Я предполагаю, что, поскольку словари сохраняют порядок полей в python3, это должно быть так.
@OluwafemiSule, поэтому соответствующей строкой будет result = db.Movies.find_one_and_update({"_id": document['_id']}, {"$set": {"MD5Hash": md5, "UpdateTime": update_time}}, return_document=ReturnDocument.AFTER). Я не вижу ничего, что могло бы изменить структуру. Мое исправление заключалось в том, чтобы отредактировать оператор в узле перед отправкой его обратно в таблицу, это не так уж и плохо. Но все же было бы неплохо узнать, в чем дело!





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