我知道python-eve支持aggregation和filtering。我知道如何单独使用它们:
$ curl -i http://example.com/posts?aggregate={"$value": 2}
http://eve-demo.herokuapp.com/people?where={"lastname": "Doe"}
但问题是:我可以同时使用它们吗?
例如,我定义了一个端点,如:
posts = {
'datasource': {
'aggregation': {
'pipeline': [
{"$unwind": "$tags"},
{"$group": {"_id": "$tags", "count": {"$sum": "$value"}}},
{"$sort": SON([("count", -1), ("_id", -1)])}
]
}
}
}
我可以使用如下的查询网址:
http://eve-demo.herokuapp.com/people?where={"lastname": "Doe"}&aggregate={"$value": 2}
答案 0 :(得分:2)
简短回答是是,但您需要使用$match
命令在聚合中定义过滤。 filter
中的data_source
个密钥不接受来自网址的参数。
例如,
things_recommended = {
'url': 'things/recommended/',
'datasource': {
'source': 'things',
'aggregation': {
'pipeline': [
{"$match": {"id":"$id"}},
{"$lookup": {
"from": "other_collection",
"localField": "localField",
"foreignField": "foreignField",
"as": "some_field"}}
]
}
}
}
查询网址就像
some_url/things/recommended?aggregate={"$id": 1}
请注意,您需要使用encoderUrlComponent
和JSON.stringfy
来转义此网址中的字符。
您甚至可以传递整个匹配条件:
things_recommended = {
'url': 'things/recommended/',
'datasource': {
'source': 'things',
'aggregation': {
'pipeline': [
{"$match": "$where$},
{"$lookup": {
"from": "other_collection",
"localField": "localField",
"foreignField": "foreignField",
"as": "some_field"}}
]
}
}
}
查询网址就像
some_url/things/recommended?aggregate={"$where": {"$or": [{"family": "$family_id"}, {"is_shared": True}]}}
请注意,您需要使用encoderUrlComponent
和JSON.stringfy
来转义此网址中的字符。
我已在我的计算机上测试过它。