2017-07-15 96 views
0

我使用python逐行遍歷cvs文件。我需要將當前記錄的2列與MongoDB中的現有記錄進行比較。如果不存在,則將其插入到mongo中,否則如果;需要將當前記錄的所有字段與mongoDB中的現有記錄進行比較,並且將當前記錄插入舊記錄的位置,並且只有字段中的更改纔會保存在同一文檔的歷史記錄json中。 MongoDB中將當前記錄與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" 
} 

當前記錄:

{ 
    "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」。如果當前記錄的這兩個字段與MongoDB中的現有記錄相同,則需要比較記錄的其他字段。在這種情況下,不同的是在ID,UCM,網站領域,因此需要保持類似下面的變化字典...

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

注:MongoDB是遠程訪問服務器,所以無法做到像本地機器上操作的操作

+0

我想我明白你正在嘗試做的......我最好的recommandation會將您的CSV行轉換爲字典,然後使用libr像['deepdiff'](https://github.com/seperman/deepdiff)來控制有什麼區別。 – Fabien

+0

嗨Fabien,感謝你的建議...我是新的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 
相關問題