【问题标题】:Express JS unlimited query parameter function?Express JS 无限查询参数功能?
【发布时间】:2021-07-18 16:54:55
【问题描述】:

我试图在 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}`,
                            'path': 'title',
                        }
                    }
                },
                {
                    '$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/]

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

【问题讨论】:

    标签: javascript arrays mongodb faceted-search rest-parameters


    【解决方案1】:

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

    function endPoint (req, res) {
    const queriesFound ={}
    
    req.query.forEach(query=>{
    
    queriesFound[query]=query;
    }
    
    QueriesFound will be an object
    
    { “Name”:”Name”, “AnotherParam”:”AnotherParam” }
    
    }
    

    //QueriesFound 将是一个对象

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

    【讨论】:

    • 好的,这很好,但是 5 或 8 个参数呢?我需要为每个参数分别定义constant 吗?
    • 请对该主题进行完整编辑。我越来越糊涂了。
    • 如何将所有key,value 存储在JSON facetjson = [{'$match': {[keystore]: ${valuestore}}}]
    【解决方案2】:

    您的请求 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 });
        }
    

    })

    【讨论】:

    • 感谢您的回答。但我想像电子商务网站一样建立一个 Facets 搜索。所以,&keys=brand,color&values=rasna,yellow 不是我想的好方法,对于搜索引擎优化也是如此。像这样:&key=brand&value=rasna&key=color&value=yellow
    • 或类似的东西:&color=blue&length=medium&size=large 示例网址:paytmmall.com/shop/…
    • 采用这种方法。我不会每次都包含键值 :) PLZZ any Idea
    • 我编辑了我的描述和代码。我希望这个对你有用。 @DivyanshuSah
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-22
    • 2017-11-09
    • 1970-01-01
    相关资源
    最近更新 更多