2017-03-29 6 views
0

Meine Hauptabsicht ist es, dynamisch ändern die Mitarbeiter Sammlung während der Verwendung von Pymongo, und ich konnte es für einfügen Befehle, ich habe Probleme mit dem Befehl find, egal was ich exec () gibt immer None zurück. aber wenn ich die Zeichenfolge kopieren und ausführen, wird der Wert der Variablen zugewiesen.Ersetzen von Variablen Wert in Mongodb-Anweisung

kann jemand etwas Licht darauf werfen, warum die exec nicht in der Lage ist, eine Ergebnismenge zurückzugeben oder die Ergebnismenge einer Variablen zuzuordnen?

db.Employees.update_one(
     {"id": criteria}, 
     { 
     "$set": { 
      "name":name, 
      "age":age, 
      "country":country 
     } 
     } 
    ) 

from pymongo import MongoClient 
import ast 

client = MongoClient('localhost:27017') 
db = client.TextClassifier 

Einsatz arbeitet

def mongo_insert_one(COLLECTION_NAME, JSON): 
    QUERY = """db.%(COLLECTION_NAME)s.insert_one(%(JSON)s)""" % locals(); 
    exec(QUERY)  

def mongo_retrive(COLLECTION_NAME, JSON): 
    resultset = None 
    query = """resultset = db.%(COLLECTION_NAME)s.find(%(JSON)s)""" % locals(); 
    return resultset 


print(mongo_retrive('hungry_intent', "{'Intent':'Hungry'}")) 

weder diese

dies nicht funktionieren würde für einen ganz anderen Grund funktionieren würde, heißt es Wenn Sie Methode, um die ‚Einheimischen‘ nennen soll auf Ein 'Datenbank' -Objekt schlägt fehl, weil keine solche Methode existiert.

resultset = db.locals()[COLLECTION_NAME].find() 

Antwort

1

PyMongo Datenbankobjekte Notation Stützträger eine benannte Sammlung zuzugreifen und PyMongo des enthielten BSON Modul bietet einen viel besseren JSON-Decoder als „eval“:

from bson import json_util 

COLLECTION_NAME = 'hungry_intent' 
JSON = "{'Intent':'Hungry'}" 
print(list(db[COLLECTION_NAME].find(json_util.loads(JSON)))) 

Dies wird schneller und zuverlässiger als Ihr "Eval" -Code, und verhindert auch den injection Angriff, für den Ihr "eval" -Code anfällig ist.

Wenn Sie vermeiden können, JSON mit überhaupt könnte es bevorzugt sein:

COLLECTION_NAME = 'hungry_intent' 
QUERY = {'Intent':'Hungry'} 
print(list(db[COLLECTION_NAME].find(QUERY))) 
+0

'def mongo_insert_one (COLLECTION_NAME, JSON): db [COLLECTION_NAME] .insert_one (JSON) def mongo_retrive (COLLECTION_NAME, JSON): resultset = db [SAMMLUNG_NAME] .find (JSON) ' Vielen Dank. –