2016-10-05 9 views
1

MongoDBとPythonを使ってルールエンジンを開発しています。 MongoDBのルールをルールデータベース "myrulesdb"に保存し、それを使って異なるコレクションの集約パイプラインを実行したいとします。私はパイプを印刷するとき、私は正しい文字列を取得していますmongoDBに集約パイプラインを保存するにはどうすればいいですか?

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) 

:MongoDBの中に保存されたルールは

{ 
"_id" : ObjectId("57f46e843166d426a20d5e08"), 
"Rule" : "[{\"$match\":{\"Name.First\":\"Sunil\"}},{\"$limit\":5}]", 
"Description" : "You live long life" 
} 

Pythonのコードです。

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

私は()関数を集約し、これを通過したときにしかし、それは私に次のエラー与える:データベースからのパイプラインを検索した後

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

を、どのように私はそれを()関数を集約するために渡すことができますか?

答えて

1

私はなぜあなたがこれをやっているのかわかりませんが、ここでの原因は文字列のRuleフィールドの値です。

>>> 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'> 
を:あなたは print()機能付き少しデバッグのをしようとした場合、あなたの type(pipe)利回り <class 'str'>

あなたはこのようなjson.loadsを使用して値をロードすることによってこの問題を解決することができていることがわかります

関連する問題