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>})
.
我该怎么做?
我通过在 DOMAIN
键 centroids
(数据库集合的名称)中包含一个规则列表来试一试,如下所示,
crater = {
...
}
body = {
'item_title': 'body craters',
'url': 'centroids/<regex("[\w]+"):body>'
}
DOMAIN = {
'centroids': [crater, body],
}
但是没用...
AttributeError: 'list' object has no attribute 'setdefault'
知道了!
我假设 DOMAIN
结构中的 keys 与 collection Eve 直接相关查询。默认设置是这样,但可以在资源 datasource.
中进行调整
我在处理与问题类似的情况时发现了这一点:我想要一个端点 hostname/bodies
列出 centroids
中 body
的所有(唯一)值] 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/hokusai
的name
、body
和coordinates
。
- 和端点
http://127.0.0.1:5000/bodies
,centroids
中 body
的唯一值列表。
漂亮。为夏娃点赞!
我有一个 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>})
.
我该怎么做?
我通过在 DOMAIN
键 centroids
(数据库集合的名称)中包含一个规则列表来试一试,如下所示,
crater = {
...
}
body = {
'item_title': 'body craters',
'url': 'centroids/<regex("[\w]+"):body>'
}
DOMAIN = {
'centroids': [crater, body],
}
但是没用...
AttributeError: 'list' object has no attribute 'setdefault'
知道了!
我假设 DOMAIN
结构中的 keys 与 collection Eve 直接相关查询。默认设置是这样,但可以在资源 datasource.
我在处理与问题类似的情况时发现了这一点:我想要一个端点 hostname/bodies
列出 centroids
中 body
的所有(唯一)值] 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/hokusai
的name
、body
和coordinates
。 - 和端点
http://127.0.0.1:5000/bodies
,centroids
中body
的唯一值列表。
漂亮。为夏娃点赞!