【问题标题】:pymongo typeError: document must be an instance of dict, bson.son.SON, bson.raw_bson.RawBSONDocumentpymongo typeError: document must be an instance of dict, bson.son.SON, bson.raw_bson.RawBSONDocument
【发布时间】:2017-08-14 12:57:01
【问题描述】:

我试图将数据从 SQL Server 迁移到 MongoDB,但在最后阶段将数据导入 MongoDB 时遇到类型错误。

mongoImp = dbo.insert_many(jArray)
  File "/home/lrsa/.local/lib/python2.7/site-packages/pymongo/collection.py", line 710, in insert_many
    blk.ops = [doc for doc in gen()]
  File "/home/lrsa/.local/lib/python2.7/site-packages/pymongo/collection.py", line 702, in gen
    common.validate_is_document_type("document", document)
  File "/home/lrsa/.local/lib/python2.7/site-packages/pymongo/common.py", line 407, in validate_is_document_type
    "collections.MutableMapping" % (option,))
TypeError: document must be an instance of dict, bson.son.SON, bson.raw_bson.RawBSONDocument, or a type that inherits from collections.MutableMapping

我还检查了type(jArray),它是str。也尝试将数据类型转换为list,但未能成功。
我的代码:

import pyodbc
import json
import collections
import pymongo
from bson import json_util

odbcArray = []
mongoConStr = '192.168.10.107:36006'
sqlConStr = 'DRIVER={MSSQL-NC1311};SERVER=tcp:192.168.10.103,57967;DATABASE=AdventureWorks;UID=testuser;PWD=testuser'
mongoConnect = pymongo.MongoClient(mongoConStr)
sqlConnect = pyodbc.connect(sqlConStr)

dbo = mongoConnect.eaedw.sqlData
dbDocs = dbo.find()
sqlCur = sqlConnect.cursor()
sqlCur.execute("""
            SELECT TOP 2 BusinessEntityID,Title, Demographics, rowguid, ModifiedDate
            FROM Person.Person
            """)

tuples = sqlCur.fetchall()

for tuple in tuples:
    doc = collections.OrderedDict()
    doc['id'] = tuple.BusinessEntityID
    doc['title'] = tuple.Title
    doc['dgrap'] = tuple.Demographics
    doc['rowi'] = tuple.rowguid
    doc['mtime'] = tuple.ModifiedDate
    odbcArray.append(doc)

jArray = json.dumps(odbcArray, default=json_util.default)
mongoImp = dbo.insert_many(jArray)

mongoConnect.close()
sqlConnect.close()

【问题讨论】:

  • 尝试不转储字典。

标签: python sql-server json mongodb pymongo


【解决方案1】:

查看来自 MongoDB:s 网页的 bulk insert example。跳过 json.dumps 调用(它将您的文档数组转换为 json 格式的字符串)并直接插入 odbcArray

mongoImp = dbo.insert_many(odbcArray)

【讨论】:

  • 实际上,由于odbcArray 不是 JSON 格式,因此认为行不通。所以,我已经明确转换成 jsonArray。无论如何,感谢它的帮助,它就像一个魅力
  • 我遇到了类似的问题,我将一个大的 JSON 写入 S3,然后在执行“dict_obj = json.loads(str_value)”之后将其读回并发送给 Mongo。我忘了它是多个文档,所以我只是将 insert_one 更改为 insert_many 来解决问题。
猜你喜欢
  • 2022-09-28
  • 1970-01-01
  • 2018-03-31
  • 1970-01-01
  • 1970-01-01
  • 2021-04-14
  • 1970-01-01
  • 2021-11-23
  • 2019-01-05
相关资源
最近更新 更多