ArangoDB和Foxx - 来自GET的多个查询参数

时间:2017-09-21 17:48:29

标签: arangodb foxx

(抱歉新手问题,但在文档中无法轻易找到)

我希望有一个包含几个模型的文档存储,然后在我的Foxx服务中使用一些属性作为查询中的参数。 说我有一个电影和系列剧集的数据库:

{
    'type':'movie',
    'year':'1997',
    'director':'xxxxxxx',
    ...
},
{
    'type':'series_episode',
    'season':'1',
    'episode':'3',
    ...
}
...

我需要能够搜索

当然,我想要的是拥有支持两者的单一路由器 GET /?type = movie& year = x& director = y .. GET /?type = series& season = x& episode = y 那可能吗?容易吗?

我无法找到,所以我开始认为我必须为每种类型设置不同的路由器,例如:

router.get('/movies', function (req, res) {
        const data = db._query('FOR entry IN mystore FILTER entry.type == @type, entry.year == @year RETURN entry ', 
        {'type':'movie', .....});
                res.json({
                    result: data
                })
});


router.get('/series', function (req, res) {
        const data = db._query('FOR entry IN mystore FILTER entry.type == @type, entry.season == @season, entry.episode == @episode, RETURN entry ', 
        {'type':'series', .....});
                res.json({
                    result: data
                })
})

这将是繁重的工作维持。理想情况下,我只是更新模型并使用一个路由器。

即使是最后一个选项,我也有一个问题:如何将多个参数传递给查询?我无法找到语法。

感谢任何帮助。 我正在学习ArangoDB,我对这种潜力非常感兴趣,但我无法浏览我看到的文档或示例。

谢谢

1 个答案:

答案 0 :(得分:1)

这个问题is meanwhile covered in the Foxx Manualin detail in the endpoints documentation

可以通过在JOI-router定义中指定queryParam(...)来访问查询参数,然后在功能主体中可以通过req.queryParams.yourQueryParam来访问它们。

请注意,您可以在网络界面中使用API-Tab来使用招摇工具交互式地浏览您的API。

一个非常简单的接受两个查询参数的Foxx服务看起来像这样:

'use strict';

const joi = require('joi');

const router = require('@arangodb/foxx/router')();
module.context.use(router);
router.get('/hello/', function (req, res) {
    res.send(JSON.stringify({hello: `world of FirstName: ${req.queryParams.fname} LastName: ${req.queryParams.lname}`}));
})
.queryParam('fname', joi.string().required(), 'First Name to greet.')
.queryParam('lname', joi.string().required(), 'Last Name to greet.')
.response(['text/plain'], 'A personalized greeting.')
.summary('Personalized greeting')
.description('Prints a personalized greeting.');

调用看起来像这样:

curl -X GET "http://127.0.0.1:8529/_db/_system/myfoxx/hello?fname=Joe&lname=Smith"
...
{"hello":"world of FirstName: Joe LastName: Smith"}

In Path参数可以这样实现:

'use strict';

const joi = require('joi');

const router = require('@arangodb/foxx/router')();
module.context.use(router);
router.get('/hello/:fname/:lname', function (req, res) {
    res.send(JSON.stringify({hello: `world of FirstName: ${req.pathParams.fname} LastName: ${req.pathParams.lname}`}));
})
.pathParam('fname', joi.string().required(), 'First Name to greet.')
.pathParam('lname', joi.string().required(), 'Last Name to greet.')
.response(['text/plain'], 'A personalized greeting.')
.summary('Personalized greeting')
.description('Prints a personalized greeting.');

可以这样进行调用:

curl -X GET "http://127.0.0.1:8529/_db/_system/myfoxx/hello/Joe/Smith" 
...
{"hello":"world of FirstName: Joe LastName: Smith"}