我正在使用MongoDB和Python开发一个规则引擎。我希望将MongoDB中的规则存储在规则数据库"myrulesdb"中,并希望使用它在不同的集合上运行聚合管道。
{
"_id" : ObjectId("57f46e843166d426a20d5e08"),
"Rule" : "[{\"$match\":{\"Name.First\":\"Sunil\"}},{\"$limit\":5}]",
"Description" : "You live long life"
}
Python代码:
import pymongo
from pymongo import MongoClient
client = MongoClient('localhost', 27017)
db = client['myDB']
coll = db['myColl']
ruledb = client['myrulesdb']
rulecoll = ruledb['myrules']
rule1 = rulecoll.find_one({}, {"Rule":1, "_id":0})
pipe = rule1['Rule']
print(pipe)
data = coll.aggregate(pipeline=pipe)
我得到正确的字符串时,我打印管道。
[{"$match":{"Name.First":"Sunil"}},{"$limit":5}]
但是当我把它传递给aggregate()函数时,它给出了以下错误:
data = coll.aggregate(pipeline=pipe)
in aggregate raise TypeError("pipeline must be a list")
TypeError: pipeline must be a list
从数据库中检索到管道后,如何将其传递给aggregate()函数?
2条答案
按热度按时间dpiehjr41#
我不知道你为什么要这么做,但是这里的罪魁祸首是
Rule
字段的值,它是字符串。如果你试着用print()
函数调试一下,你会发现type(pipe)
产生<class 'str'>
您可以通过使用
json.loads
加载值来修复此问题,如下所示:3b6akqbq2#
这是一个迟来的答案(但对其他人来说可能有用),而且只是在你可能考虑使用Java而不是Python的情况下,如果没有,请忽略我的答案。
您可以使用免费的小型库https://github.com/MongoPipe/mongopipe-core来进行管道保存、参数化运行、自动迁移等。