2017-07-15 2 views
0

Je parcours le fichier cvs ligne par ligne en utilisant python. J'ai besoin de comparer 2 colonnes de l'enregistrement en cours avec les enregistrements existants dans MongoDB. S'il n'est pas présent, insérez-le dans mongo, sinon si; besoin de comparer tous les champs de l'enregistrement en cours avec l'enregistrement existant dans mongoDB et l'enregistrement en cours serait inséré à la place de l'ancien enregistrement et seules les modifications dans les champs seraient enregistrées dans l'historique json dans le même document.Comparer l'enregistrement actuel avec l'enregistrement existant MongoDB en Python

enregistrement existant dans 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" 
} 

Label actuel:

{ 
    "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" 
} 

Voici les champs de validation sont "Description" et "MAC". Si ces deux champs de l'enregistrement en cours sont identiques à l'enregistrement existant dans MongoDB, il est nécessaire de comparer les autres champs de l'enregistrement. Dans cette différence de cas est en ID, UCM, champ du site, ont besoin afin de maintenir le dictionnaire des changements comme ci-dessous ...

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

Note: MongoDB est le serveur d'accès à distance, ne peut donc pas effectuer certaines opérations comme les opérations de la machine locale

+0

Je pense que je comprends ce que vous essayez de faire ... Mon meilleur recommendation serait être de transformer votre ligne CSV en un dictionnaire, puis utiliser une libr ary comme ['deepdiff'] (https://github.com/seperman/deepdiff) pour contrôler quelles sont les différences. – Fabien

+0

Salut Fabien, Merci pour vos suggestions ... je suis nouveau à python et mongo, ce serait génial si vous pouviez me fournir une structure de code détaillée .. Merci d'avance – ras

Répondre

0

Disons que vous avez un fichier CSV avec des colonnes séparées par ; vous pouvez comparer avec les documents mongo de cette façon:

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