【问题标题】:NodeJS, Mongoose - Query city, state, or zipNodeJS、Mongoose - 查询城市、州或邮编
【发布时间】:2015-07-02 11:02:25
【问题描述】:

我有一个包含城市、州和邮政编码列表的 MongoDB 数据库。我希望能够运行一个查询,该查询将根据用户输入检查每个字段,并且无法弄清楚如何执行此操作。这是数据库中的文档示例:

{"_id":"92199","city":"San Diego","state":"CA"}

这是我用来返回该文档的路线:

    app.get('/city/:city', function(req, res){
        var query = City.aggregate( [
           { $group: { _id: "$zip", city: {"$first" : "$city"}, state: {"$first" : "$state"} } },
           { $match: {"city": new RegExp(req.params.city, "i")} }
        ]);
        query.exec(function(err, city){
            if(err){
                console.log(err);
                return res.send(err);
            }
            console.log(city);
            res.json(city);
        });
    });

问题是,如果我查询 San Diego, CA,查询将失败,因为它只搜索城市。如何查询城市、州和邮编 (_id) 以便仍然返回值?

【问题讨论】:

  • 不应该聚合一次而不是每次请求
  • 我只是使用聚合,因为我所有的搜索似乎都指向它作为查询多个字段的方式。
  • 这听起来像是一个普通的查询(不是需要聚合的东西)——“查询将失败,因为它只搜索城市”是什么意思?
  • (也就是说,您可以只执行 find(),其中您的查询对象具有任意组合的 _id、city 和 state 属性中的一个或多个,它将​​返回所有匹配的文档。但是也许我错过了您希望实现的某些方面。)
  • 查询当前的工作方式是它只是搜索城市字段,所以如果我搜索“加利福尼亚州圣地亚哥”,它将失败,因为它没有搜索州并且没有城市字段包含“加利福尼亚州圣地亚哥”,只是“圣地亚哥。

标签: node.js mongodb express mongoose


【解决方案1】:

如果有人感兴趣,这最终对我有用。可能会重构,但这可行:

    app.get('/city/:city', function(req, res){

        var location = req.params.city.replace(",", "");
        location = toTitleCase(location);
        location = location.split(" ");

        for (var i = 0; i < location.length; i++) {
            if(location[i].length == 2){
                var state = location[i].toUpperCase();
                var stateIndex = i;
            }
            if(!isNaN(parseFloat(location[i])) && isFinite(location[i])){
                var zip = location[i];
                var zipIndex = i;
            }               
        }

        if(zipIndex){
            location.splice(zipIndex, 1);
        }
        if(stateIndex){
            location.splice(stateIndex, 1);
        }

        location = location.join(" ");

        if(state && zip){
             var query = City.find({
            $and: [
                { $and: [{"state": state}, {"city": new RegExp(location, "i")}] },
                { "zip" : zip }
            ]
        });
        }else if(zip){
            var query = City.find({
                $or : [{"city": new RegExp(location, "i")}, {"zip" : zip}]
            });
        }else if(state){
            var query = City.find({
                 $and: [{"state": state}, {"city": new RegExp(location, "i")}]
            });
        }
        else{
             var query = City.find({
                "city": new RegExp(location, "i")
            });
        }
        query.exec(function(err, city){
            if(err){
                console.log(err);
                return res.send(err);
            }
            res.json(city);
        });
    });

感谢 @Semicolon 对 cme​​ts 的帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-09-30
    • 1970-01-01
    • 2013-04-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-31
    • 2014-01-27
    相关资源
    最近更新 更多