2017-03-22 67 views
0

SQL ServerからMongoDBにデータを移行しようとしましたが、データのインポート中に最後のフェーズでタイプエラーが発生しましたMongoDB。pymongo typeError:ドキュメントがdictのインスタンスである必要があります。bson.son.SON、bson.raw_bson.RawBSONDocument

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 

私もstrあるtype(jArray)をチェックしています。データ型を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() 
+2

試して辞書をダンプなし。 –

答えて

2

チェックアウトのMongoDBからこのbulk insert example:sのWebページ。 (JSON形式の文字列に文書のあなたの配列をオン)json.dumpsコールをスキップし、直接odbcArrayを挿入します。

mongoImp = dbo.insert_many(odbcArray) 
+0

実際、 'odbcArray'はJSON形式ではないので、うまくいかないと思っています。したがって、私はjsonArrayに明示的に変換しました。とにかく、それは魅力のように働いていた助けてくれてありがとう –

関連する問題