我有一个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>})
回答所有文档的列表。
我该怎么做?
我通过在DOMAIN
键centroids
(数据库集合的名称)中包含规则列表来进行射击,如下所示,
crater = {
...
}
body = {
'item_title': 'body craters',
'url': 'centroids/<regex("[\w]+"):body>'
}
DOMAIN = {
'centroids': [crater, body],
}
但是没用...
AttributeError: 'list' object has no attribute 'setdefault'
答案 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}},body
和coordinates
。mercury/hokusai
是http://127.0.0.1:5000/bodies
中body
的唯一值的列表。美丽。竖起大拇指到夏娃!