如何在 mongoDB 中存储聚合管道?
How to store aggregation pipeline in mongoDB?
我正在使用 MongoDB 和 Python 开发规则引擎。我想将 MongoDB 中的规则存储在规则数据库 "myrulesdb" 中,并想将其用于 运行 不同集合上的聚合管道。 MongoDB 中保存的规则是
{
"_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() 函数?
我不知道你为什么要这样做,但这里的罪魁祸首是 Rule
字段的值,它是字符串。如果您尝试使用 print()
函数进行一些调试,您将看到 type(pipe)
产生 <class 'str'>
您可以通过使用 json.loads
加载值来解决此问题,如下所示:
>>> import json
>>> r = {"Rule" : "[{\"$match\":{\"Name.First\":\"Sunil\"}},{\"$limit\":5}]"}
>>> pipe = json.loads(r['Rule'])
>>> pipe
[{'$match': {'Name.First': 'Sunil'}}, {'$limit': 5}]
>>> type(pipe)
<class 'list'>
我正在使用 MongoDB 和 Python 开发规则引擎。我想将 MongoDB 中的规则存储在规则数据库 "myrulesdb" 中,并想将其用于 运行 不同集合上的聚合管道。 MongoDB 中保存的规则是
{
"_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() 函数?
我不知道你为什么要这样做,但这里的罪魁祸首是 Rule
字段的值,它是字符串。如果您尝试使用 print()
函数进行一些调试,您将看到 type(pipe)
产生 <class 'str'>
您可以通过使用 json.loads
加载值来解决此问题,如下所示:
>>> import json
>>> r = {"Rule" : "[{\"$match\":{\"Name.First\":\"Sunil\"}},{\"$limit\":5}]"}
>>> pipe = json.loads(r['Rule'])
>>> pipe
[{'$match': {'Name.First': 'Sunil'}}, {'$limit': 5}]
>>> type(pipe)
<class 'list'>