Express JS 无限查询参数功能?

问题描述

我试图在 express js 中设置一个无限制的查询参数。但我不知道我应该如何在我的代码中实现它。我正在使用 MongoDB aggeration

我想构建在多个 $match 阶段搜索的无限方面


工作方式如下

'http://localhost:4000/search?text=mango'
'http://localhost:4000/search?text=mango&key=brand&value=rasna' //unlimited facets.
'http://localhost:4000/search?text=mango&key=brand&value=rasna&key=color&value=yellow'  //unlimited facet parameters

这是我的代码

app.get("/search",async(request,response) => {
    try {
        const textsearch = request.query.text;

        var keystore = request.query.key;      //storing `key` in 'keystore'
        var valuestore = request.query.value;  //storing `value` in `valuestore`

        if (keystore,valuestore) {

            facetjson = [
             {
                '$match': {
                    [keystore]: `${valuestore}`  //Storing key and value in $match
                }
             }
           ]

            const Pipeline = [{
                    '$search': {
                        'text': {
                            'query': `${textsearch}`,'path': 'title',}
                    }
                },{
                    '$limit': 5
                }
            ]

            //Pushing 'facetjson' array into Pipeline array to make a filtered search possible.

            const newitem = insert(Pipeline,Pipeline.length - 1,facetjson) 

            let result = collection.aggregate(newitem).toArray();
            response.send(result);
        } else {
            const Pipeline = [{
                    '$search': {
                        'text': {
                            'query': `${textsearch}`,{
                    '$limit': 5
                }
            ]
            let result = collection.aggregate(Pipeline).toArray();
            response.send(result);
        };
    } catch (error) {
        response.status(500).send({ message: error.message });
    }
})

(JSfiddle 代码示例)[https://jsfiddle.net/divyanshuking/z0vo589e/]

==> 我知道我每次都必须在 $match 数组中为单个 Pipeline 传递 Key , Value 对。做了很多谷歌搜索,我发现我必须使用 Rest Parameter (...keystore,...valuestore)。但我不知道如何实现这一点。你们有什么更好的主意来解决这个问题吗? 请帮助我:

解决方法

为什么不使用 forEach 之类的东西

function endPoint (req,res) {
const queriesFound ={}

req.query.forEach(query=>{

queriesFound[query]=query;
}

QueriesFound will be an object

{ “Name”:”Name”,“AnotherParam”:”AnotherParam” }

}

//QueriesFound 将是一个对象

{ “姓名”:“姓名”,“另一个参数”:“另一个参数” }

,

您的请求 URL 的查询参数结构错误。如果你想在 URL 中传递多个 kay/value 对,正确的结构是这样的:

  • 'http://localhost:4000/search?text=mango&brand=rasana&color=yellow

此代码应与此 URL 结构配合使用:

app.get("/search",async(request,response) => {
    try {
        //We need "search pipeline stage" in all conditions. whether we got a key/value pair in query or not. 
        //so we use "search stage" when declare pipeline array;
        let pipeline = [{
            '$search': {
                'text': {
                    'query': `${request.query.text}`,'path': 'title',}
            }
        }];
        //If there are keys/values pairs in the query parameters,we add match stage to our pipeline array;
        if(request.query) {
            let match = {},hasMatchSatge = false;
            for(let item in request.query){
                if(item !=== 'text'){
                   match[item] = request.query[item];
                   hasMatchStage = true;
                }
            }
            if(hasMatchStage) pipeline.push({'$match': match});
        }
        //Finally,we add our "limit stage" to the pipeline array;
        pipeline.push({'$limit' : 5});
        let result = collection.aggregate(pipeline).toArray();
        response.status(200).send(result);
    } catch (error) {
        response.status(500).send({ message: error.message });
    }

})

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...