2017-07-07 4 views
0

Mongodbからcsvをエクスポートするためのpythonスクリプトを作成しました。それはmongodbからのフィールドのすべてのデータをエクスポートしなかったので、うまく機能しませんでした。いくつかのレコードがコレクションで見つからないので、私はgetメソッドを使います。python getメソッドがcsvファイル内のすべてのデータをエクスポートしない

のMongoDBサンプル:

"experience": [ 
     { 
      "order": null, 
      "date": { 
       "to": ISODate("2017-07-04T21:24:31.872Z"), 
       "from": ISODate("2003-08-16T21:24:31.872Z") 
      }, 
      "description": "Trained horses for various competitions. ", 
      "company": "D2 Ranch", 
      "position": "Horse Trainer" 
     }, 
     { 
      "order": null, 
      "date": { 
       "to": ISODate("2017-07-04T21:24:31.872Z"), 
       "from": ISODate("2003-08-16T21:24:31.872Z") 
      }, 
      "description": "Trained horses for various competitions. 2", 
      "company": "D2 Ranch 2", 
      "position": "Horse Trainer 2" 
     } 
    ] 

Pythonスクリプト:経験のフィールドに:

import sys 
sys.setdefaultencoding('utf-8') 
import codecs 
import csv 
cursor = db.user_profiles.find ({}, {'_id':1, 'experience.description':1, 'experience.position':1}) 
with codecs.open('skills.csv','w', encoding='utf-8') as outfile: 
    fields = ['_id', 'experience.description', 'experience.position']   
    write = csv.DictWriter(outfile, fieldnames=fields) 
    write.writeheader() 
    for x in cursor: 
    x_id = x['_id'] 
     for y in x.get('experience', {}):    
      z = { 
      '_id':x_id,       
      'experience.description':y.get('description',None), 
       'experience.position':y.get('position',None)}    
     write.writerow(z) 

問題は、第2のレコード( "馬トレーナー2" の位置)をスキップしています。何か助けを感謝します。ありがとう

答えて

0

少なくとも、バージョン3.4.4ではmongoクエリが良いと思われます。

{ 
    "_id" : ObjectId("59995fb7513601164f1325f8"), 
    "experience" : [ 
     { 
      "description" : "Trained horses for various competitions. ", 
      "position" : "Horse Trainer" 
     }, 
     { 
      "description" : "Trained horses for various competitions. 2", 
      "position" : "Horse Trainer 2" 
     } 
    ] 
} 

あなたのpythonスクリプト(またはその書式設定、pythonの重要な部分)に問題があるようです。今度は、各経験リストにこのコードはの1つだけ要素を格納します。行書き込みコードは、forループの後にのみ実行されます。これは、次のように内部にある必要があります。

for y in x.get('experience', {}):    
    write.writerow({ 
     '_id':x_id,       
     'experience.description':y.get('description',None), 
     'experience.position':y.get('position',None) 
    }) 
関連する問題