Eve:如何使用不同的端点访问具有不同过滤器的同一集合

Eve: how to use different endpoints to access the same collection with different filters

我有一个 Eve 应用发布了一个简单的只读 (GET) 界面。它正在连接一个名为 centroids 的 MongoDB 集合,其中包含如下文档:

[
{
  "name":"kachina chasmata",
  "location":{
    "type":"Point",
    "coordinates":[-116.65,-32.6]
  },
  "body":"ariel"
},
{
  "name":"hokusai",
  "location":{
    "type":"Point",
    "coordinates":[16.65,57.84]
  },
  "body":"mercury"
},
{
  "name":"cañas",
  "location":{
    "type":"Point",
    "coordinates":[89.86,-31.188]
  },
  "body":"mars"
},
{
  "name":"anseris cavus",
  "location":{
    "type":"Point",
    "coordinates":[95.5,-29.708]
  },
  "body":"mars"
}
]

目前,(Eve) 设置声明 DOMAIN 如下:

crater = {
    'hateoas': False,
    'item_title': 'crater centroid',
    'url': 'centroid/<regex("[\w]+"):body>/<regex("[\w ]+"):name>',
    'datasource': {
        'projection': {'name': 1, 'body': 1, 'location.coordinates': 1}
    }
}

DOMAIN = {
    'centroids': crater,
}

这将成功回答 http://hostname/centroid/<body>/<name> 形式的请求。在 MongoDB 中,这表示一个查询,如:db.centroids.find({body:<body>, name:<name>}).

我还想做的是为 所有 给定 body 的文档提供一个端点。即,对 http://hostname/centroids/<body> 的请求将使用 body==<body> 回答所有文档的列表:db.centroids.find({body:<body>}).

我该怎么做?

我通过在 DOMAINcentroids(数据库集合的名称)中包含一个规则列表来试一试,如下所示,

crater = {
...
}

body = {
    'item_title': 'body craters',
    'url': 'centroids/<regex("[\w]+"):body>'
}

DOMAIN = {
    'centroids': [crater, body],
}

但是没用...

AttributeError: 'list' object has no attribute 'setdefault'

知道了!

我假设 DOMAIN 结构中的 keyscollection Eve 直接相关查询。默认设置是这样,但可以在资源 datasource.

中进行调整

我在处理与问题类似的情况时发现了这一点:我想要一个端点 hostname/bodies 列出 centroidsbody 的所有(唯一)值] collection。为此,我需要为其设置一个 aggregation

以下设置完全符合我的要求 ;)

centroids = {
    'item_title': 'centroid',
    'url': 'centroid/<regex("[\w]+"):body>/<regex("[\w ]+"):name>',
    'datasource': {
        'source': 'centroids',
        'projection': {'name': 1, 'body': 1, 'location.coordinates': 1}
    }
}

bodies = {
    'datasource': {
        'source': 'centroids',
        'aggregation': {
            'pipeline': [
                {"$group": {"_id": "$body"}},
            ]
        },
    }
}

DOMAIN = {
    'centroids': centroids,
    'bodies': bodies
}
  • 端点,例如http://127.0.0.1:5000/centroid/mercury/hokusai给我mercury/hokusainamebodycoordinates
  • 和端点 http://127.0.0.1:5000/bodiescentroidsbody 的唯一值列表。

漂亮。为夏娃点赞!