2017-07-15 8 views
0

私はpythonを使って行ごとにcvsファイルをトラバースしています。現在のレコードの2列とMongoDBの既存のレコードを比較する必要があります。存在しない場合はそれをmongoに挿入します。現在のレコードのすべてのフィールドをmongoDBの既存のレコードと比較する必要があり、現在のレコードが古いレコードの場所に挿入され、フィールド内の変更のみが同じ文書内のHistory jsonに保存されます。現在のレコードをPythonのMongoDBの既存のレコードと比較する

{ 
    "_id" : ObjectId("59661c4d5e2bb8a9c80e74b8"), 
    "ID" : 149, 
    "UID" : "2017-06-01__ccm-401__238AC3E", 
    "Date" : "2017-06-01", 
    "Timestamp" : "2017-06-01 08:00:14", 
    "UCM" : "ccm-401", 
    "Description" : "SJC08-1-LOBBY", 
    "Site" : "SJC", 
    "Building" : "SJC08", 
    "Floor" : 1, 
    "Room_Name" : "LOBBY", 
    "MAC" : "SEP001DA238AC3E" 
} 

現在のレコード:MongoDBのレコードの既存

{ 
    "ID" : 149, 
    "UID" : "2017-06-05__ccm-401__238AC3E", 
    "Date" : "2017-06-01", 
    "Timestamp" : "2017-06-01 08:00:14", 
    "UCM" : "ccm-402", 
    "Description" : "SJC08-1-LOBBY", 
    "Site" : "SSC", 
    "Building" : "SJC08", 
    "Floor" : 1, 
    "Room_Name" :"LOBBY", 
    "MAC" : "SEP001DA238AC3E" 
} 

ここで検証フィールドは、 "説明" と "MAC" です。現在のレコードのこれら2つのフィールドがMongoDBの既存のレコードと同じ場合、レコードの他のフィールドを比較する必要があります。この場合、差はIDであるには、UCM、サイトのフィールドは、そう...以下のような変化の辞書を維持する必要が

COLL { 
'uid': 
'mac': 
'name': 
'ip': 
'status': 
'date': 
. 
. 
'config_history': 
[ 
     { 
     'date': 
     'status': 
     'ip': 
     . 
     . 
     }, 
    { 
     'date': 
     'status': 
     'ip': 
     . 
     . 
    } 
] 
} 

注:MongoDBは、リモートアクセスサーバーなので、ローカルマシン操作などの操作を行うことはできません

+0

私は私はあなたがやろうとしているかを理解することを考えて...私の最高のrecommandationうあなたのCSVラインを辞書に変換してから、相違点を制御するために['deepdiff'](https://github.com/seperman/deepdiff)のようなものです。 – Fabien

+0

こんにちはファビアン、おかげさまで、ご意見ありがとうございます...私は、Pythonとmongoに新しいです、あなたは私に詳細なコード構造を提供することができれば素晴らしいでしょう..事前に感謝 – ras

答えて

0

のは、あなたがこの方法により、モンゴ文書を比較することができ;で区切られた列を持つCSVを持っているとしましょう:

csv_lines = open('myfile.csv', 'r').read().split('\n') 
# Iterate over lines 
for line in csv_lines: 
# Break the line to get the columns 
cols = line.split(';') 
# Build an object for comparison 
csv_dict = { 
    'UID' : cols[0], 
    'MAC' : cols[1], 
    # etc, etc. the key names are equal to the one in Mongo whenever it is possible 
} 
# compare 
cursor = collection.find({ 
    'UID' : csv_dict['UID'], 
    # etc. with other match criterias 
}) 
# Check if we have documents 
if cursor.count(): 
    # Yes, browse the results 
    for document in cursor: 
    # Perform deeper comparison by looking all the keys in csv_dict 
    for key in csv_dict: 
    # Is key missing in Mongo? 
    if key not in document: 
    # Missing key 
    elif csv_dict[key] != document[key] 
    # Different value 
関連する問題