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