平安夜:如何使用不同的端点通过不同的过滤器访问同一集合

时间:2019-07-17 12:21:45

标签: python mongodb eve

我有一个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"
}
]

当前,(夏娃)设置声明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的所有文档提供一个 all 端点。即,对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'

1 个答案:

答案 0 :(得分:0)

知道了!

我假设DOMAIN结构中的与夏娃正在查询的 collection 直接相关。默认设置是正确的,但是可以在资源datasource中进行调整。

我想出了类似问题的解决方法:我想让端点hostname/bodies列出body集合中centroids的所有(唯一)值。为此,我需要为其设置一个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给我name的{​​{1}},bodycoordinates
  • 端点mercury/hokusaihttp://127.0.0.1:5000/bodiesbody的唯一值的列表。

美丽。竖起大拇指到夏娃!

相关问题