我的主要目的是在使用pymongo时动态更改Employees集合,我能够为插入命令执行此操作,我遇到了find命令的问题,无论我做什么,exec()总是返回None。但如果我复制字符串并运行它,则将值赋值给变量。
有人可以解释为什么exec无法返回结果集或将结果集分配给变量?
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
插入作品
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'}"))
这两者都不会起作用
resultset = exec(""" db.%(COLLECTION_NAME)s.find( %(JSON)s )""" % locals();)
这不能用于完全不同的原因,它说如果你打算在'数据库'对象上调用'locals'方法,它就会失败,因为不存在这样的方法。
resultset = db.locals()[COLLECTION_NAME].find()
答案 0 :(得分:2)
PyMongo数据库对象支持括号表示法来访问命名集合,而PyMongo包含的bson模块提供了比#" eval"更好的JSON解码器:
from bson import json_util
COLLECTION_NAME = 'hungry_intent'
JSON = "{'Intent':'Hungry'}"
print(list(db[COLLECTION_NAME].find(json_util.loads(JSON))))
这比你的" eval"更快,更可靠。代码,也可以防止你的注射攻击#34; eval"代码容易受到攻击。
如果你可以完全避免使用JSON,那就更好了:
COLLECTION_NAME = 'hungry_intent'
QUERY = {'Intent':'Hungry'}
print(list(db[COLLECTION_NAME].find(QUERY)))