Pymongo bson.errors.InvalidDocument: не может кодировать объект при чтении из файла - PullRequest
0 голосов
/ 11 июня 2018

У меня есть csv файл со строкой заголовка и 100k записей в нем.

Я использую python в pycharm IDE и conda в качестве интерпретатора Python.conda поддерживает pymongo-3.4.0 как mongo-driver.

Я анализирую свой файл csv и сохраняю его как файл json n на диске, а затем перебираю файл json, чтобы вставить объекты json в базу данных mongo.

JSON выглядит следующим образом:

{
  a1 : {'name': 702104534, type='Single' }
  a2 : {'name': 702104535, type='Single' }
  a3 : {'name': 702104536, type='Married' }
}

Код Python:

import pymongo
import pickle

with open('my_json_file.json', 'rb') as in_file:
    person_json = pickle.load(in_file)

conn = pymongo.MonogClient('localhost','27017')
db = conn['db']
coll = db['coll']

persons = person_json.keys()
for person in persons:
    coll.insert_one(person_json[person])

Появляется следующая ошибка:

Traceback (most recent call last):
File "C:/PyCharmWorkSpace/LCR/json2mongo.py", line 109, in <module>
    data2mongo()
File "C:/PyCharmWorkSpace/LCR/json2mongo.py", line 89, in data2mongo
    coll.insert_one(json_str)
File "C:\Anaconda3\lib\site-packages\pymongo\collection.py", line 657, in insert_one
    bypass_doc_val=bypass_document_validation),
File "C:\Anaconda3\lib\site-packages\pymongo\collection.py", line 562, in _insert
    check_keys, manipulate, write_concern, op_id, bypass_doc_val)
File "C:\Anaconda3\lib\site-packages\pymongo\collection.py", line 543, in _insert_one
    check_keys=check_keys)
File "C:\Anaconda3\lib\site-packages\pymongo\pool.py", line 424, in command
    self._raise_connection_failure(error)
File "C:\Anaconda3\lib\site-packages\pymongo\pool.py", line 552, in _raise_connection_failure
    raise error
File "C:\Anaconda3\lib\site-packages\pymongo\pool.py", line 419, in command
    collation=collation)
File "C:\Anaconda3\lib\site-packages\pymongo\network.py", line 94, in command
    None, codec_options, check_keys)
bson.errors.InvalidDocument: Cannot encode object: 702104534

Однако то же самое работает, еслистрока json является переменной

Код Python:

import pymongo

conn = pymongo.MonogClient('localhost','27017')
db = conn['db']
coll = db['coll']

person = {'name': 702104534, 'type'='Single' }
coll.insert_one(person)

Спасибо за помощь.

1 Ответ

0 голосов
/ 11 июня 2018

Похоже, что pymongo имеет некоторые проблемы совместимости приведения типов во время выполнения, когда json динамически генерируется или читается из файла на диске, когда строка json имеет значение , вставленное вmongodb с использованием любого из методов вставки, таких как insert или insert_one или insert_many.

Я смог вставить json объекты в mongodb, связав стандартное приведение типов Python.

...