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

ArangoDB和Foxx-来自GET的多个查询参数,arangodb,foxx,Arangodb,Foxx,(很抱歉提出新手问题,但在文档中无法轻松找到) 我希望有一个带有几个模型的文档存储,然后在我的Foxx服务中,在查询中使用一些属性作为参数。 假设我有一个电影和系列剧的db: { 'type':'movie', 'year':'1997', 'director':'xxxxxxx', ... }, { 'type':'series_episode', 'season':'1', 'episode':'3', ... } ... 我

(很抱歉提出新手问题,但在文档中无法轻松找到)

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

{
    'type':'movie',
    'year':'1997',
    'director':'xxxxxxx',
    ...
},
{
    'type':'series_episode',
    'season':'1',
    'episode':'3',
    ...
}
...
我需要能够在上面搜索

当然,我想做的是拥有一个能同时支持这两种功能的单路由器 获取/?类型=电影和年份=x和导演=y。。 获取/?类型=系列和季节=x和插曲=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
                })
})
curl -X GET "http://127.0.0.1:8529/_db/_system/myfoxx/hello?fname=Joe&lname=Smith"
...
{"hello":"world of FirstName: Joe LastName: Smith"}
这将是一项繁重的维护工作。理想情况下,我只需要更新模型并使用一个路由器

即使对于最后一个选项,我也有一个问题:如何向查询传递多个参数?我找不到语法

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

谢谢你

这个问题

查询参数可以通过在JOI路由器定义中指定
queryParam(…)
s来访问,随后在函数体中,可以通过
req.queryParams.yourQueryParam
访问查询参数

请注意,您可以使用webinterface中的
API
-选项卡使用swagger以交互方式浏览API

接受两个查询参数的非常简单的Foxx服务可能如下所示:

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
                })
})
curl -X GET "http://127.0.0.1:8529/_db/_system/myfoxx/hello?fname=Joe&lname=Smith"
...
{"hello":"world of FirstName: Joe LastName: Smith"}
“严格使用”;
const-joi=需要(“joi”);
const router=require('@arangodb/foxx/router')();
模块.context.use(路由器);
router.get('/hello/',函数(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 Greeting')
.response(['text/plain'],'A personalized问候语')
.summary(“个性化问候语”)
.description('打印个性化问候语');
调用可以如下所示:

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
                })
})
curl -X GET "http://127.0.0.1:8529/_db/_system/myfoxx/hello?fname=Joe&lname=Smith"
...
{"hello":"world of FirstName: Joe LastName: Smith"}
路径内参数可以如下实现:

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
                })
})
curl -X GET "http://127.0.0.1:8529/_db/_system/myfoxx/hello?fname=Joe&lname=Smith"
...
{"hello":"world of FirstName: Joe LastName: Smith"}
“严格使用”;
const-joi=需要(“joi”);
const router=require('@arangodb/foxx/router')();
模块.context.use(路由器);
router.get('/hello/:fname/:lname',函数(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 Greeting')
.response(['text/plain'],'A personalized问候语')
.summary(“个性化问候语”)
.description('打印个性化问候语');
调用可以这样做:

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

谢谢,这回答了问题。还有一件事——我的目标是在过滤器中使用这些参数。如何支持可选参数?e、 g.我想筛选名字或姓氏'router.get('/people',function(req,res){const keys=db._query(aql'用于${foxxColl}筛选项中的条目.firstName=${req.queryParams.fname}筛选项.lastName=${req.queryParams.lname}返回项');res send(keys);}.queryParam('fname',joi.string().optional(),First Name..).queryParam('lname',joi.string().optional(),'Last Name.')…`@costateixeira您可以执行类似于
筛选的操作${req.queryParams.fname}| | entry.firstName=${req.queryParams.fname}
(即显式检查参数是否已设置),或者您可以使用aql帮助器方法(嵌套aql模板并使用aql.join)构建过滤器:谢谢@AlanPlum,但如果我设置了
过滤器${req.queryParams.fname}| | | entry.firstName=${req.queryParams.fname}
我在位置3:12处的“| | entry.firstName==\n\t\t过滤器…”附近得到了意外的or运算符(解析时)-我猜如果参数为null,则行在语法上不正确。。?如果我能让aql.join发挥作用,那就太好了。有没有关于如何有条件地定义筛选器的示例?再一次,很抱歉我的问题。谢谢@啊,对不起,我看错了。未定义的值将被忽略。尝试将默认值设置为
null
。例如,
const{fname=null}=req.queryParams
然后使用
fname
而不是
req.queryParams.fname
。使用joi
joi.string().optional()。我认为默认值(null)
也可以。