我可以在python-eve中指定where和aggregate同时聚合吗?

时间:2017-08-04 18:58:20

标签: python mongodb aggregation-framework where eve

我知道python-eve支持aggregationfiltering。我知道如何单独使用它们:

$ 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}

1 个答案:

答案 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} 请注意,您需要使用encoderUrlComponentJSON.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}]}} 请注意,您需要使用encoderUrlComponentJSON.stringfy来转义此网址中的字符。

我已在我的计算机上测试过它。