在Mongodb语句中替换变量值

时间:2017-03-29 17:22:06

标签: python-3.x pymongo

我的主要目的是在使用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()

1 个答案:

答案 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)))