繁体   English   中英

如何在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)

当我打印 pipe 时,我得到了正确的字符串。

[{"$match":{"Name.First":"Sunil"}},{"$limit":5}]

但是当我将它传递给 aggregate() function 时,它给了我以下错误:

data = coll.aggregate(pipeline=pipe)
in aggregate raise TypeError("pipeline must be a list")
TypeError: pipeline must be a list

从数据库中检索管道后,如何将其传递给 aggregate() function?

我不知道你为什么这样做,但这里的罪魁祸首是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'>

这是一个迟到的答案(但可能对其他查看此问题的人有用)并且仅在您可能考虑使用Java而不是 Python 的情况下。如果不是,请忽略我的回答。
可以使用免费小库https://github.com/MongoPipe/mongopipe-core来做流水线保存、参数化运行、自动迁移等。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM