【问题标题】:Pymongo bson.errors.InvalidDocument: Cannot encode Object when read from filePymongo bson.errors.InvalidDocument:从文件读取时无法编码对象
【发布时间】:2018-11-20 23:10:14
【问题描述】:

我有一个 csv 文件,其中有一个标题行和 100k 个条目。

我在pycharm IDE 和conda 中使用python 作为python 解释器。 conda 提供pymongo-3.4.0mongo-driver

我解析我的csv 文件并将其保存为磁盘上的jsonn 文件,然后遍历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)

感谢您的帮助。

【问题讨论】:

  • 你能print(type(person_json[person]['name']))
  • @arthur &lt;class 'numpy.int32'&gt;,也尝试使用bson.int64.Int64(702104534)进行类型转换,然后错误变为bson.errors.InvalidDocument: Cannot encode object: 0
  • 任何推荐的解决方案,@arthur???
  • 您是否尝试使用 int() 而不是 bson.int64.Int64() 进行投射?
  • 是的,当我执行bson.int64.Int64() 时,错误变为bson.errors.InvalidDocument: Cannot encode object: 0

标签: python mongodb pymongo bson


【解决方案1】:

json 是动态生成或从基于磁盘的文件中读取时,pymongo 似乎存在一些运行时类型转换兼容性问题,而json 字符串被插入 mongodb 使用任一插入方法,例如 insertinsert_oneinsert_many

通过关联标准 python 类型转换,我能够将 json 对象插入到 mongodb

【讨论】:

    猜你喜欢
    • 2021-04-30
    • 2014-06-03
    • 2015-08-13
    • 1970-01-01
    • 2019-08-15
    • 2017-11-17
    • 2023-03-05
    • 2021-12-19
    • 2016-01-09
    相关资源
    最近更新 更多