【问题标题】:How to Filter by sportsname如何按运动名称过滤
【发布时间】:2014-11-12 21:13:22
【问题描述】:

我正在开发一个必须按运动名称过滤的应用程序。我是 在后端使用 Node.js 和 MongoDB。

这是我的代码:-

router.route('/user/:_id/explore/:sportsname')

.get(function(req, res, next){
        var query = Host.find();

        if(req.query.sportsname){
                query.where({sportsname:req.query.sportsname});
        }

        query.exec(function(err,sportsname){
                if(err)
                        return next(err);
                res.json(sportsname);
                console.log(sportsname);
        })
});

这是文件。我想通过sportsname搜索用户

[  
   {  
      "_id":"5460e2af4ee5216f17000061",
      "maxplayer":"1",
      "minplayer":"11",
      "date":"10 August 2014",
      "venue":"google",
      "time":"Afternoon",
      "sportsname":"Lawn Tennis",
      "__v":0
   },
   {  
      "_id":"5460ff1b4ee5216f17000065",
      "maxplayer":"0",
      "minplayer":"9",
      "date":"10 October 2014",
      "venue":"google",
      "time":"Early Morning",
      "sportsname":"Cricket",
      "__v":0
   },
   {  
      "_id":"5461a4014ee5216f17000089",
      "maxplayer":"4",
      "minplayer":"29",
      "date":"13 December 2014",
      "venue":"google",
      "time":"Afternoon",
      "sportsname":"Lawn Tennis",
      "__v":0
   }
]

当我在那个时间运行时,它没有过滤。

【问题讨论】:

  • 您的文档是什么样的?没有那个没有人知道如何回答。还有req.params.sportsname。那么应该是“查询”应该是网址中的一个参数
  • req.query.sportsname 应该是 req.params.sportsname
  • 好的,谢谢。让我替换它并运行它...
  • @Neil Lunn:谢谢。如果你不介意的话,你能简单地告诉我。
  • 您需要在问题上使用 edit 链接。不要尝试将其他信息作为评论发布。

标签: node.js mongodb mongoose mongodb-query


【解决方案1】:

首先,您使用的是req.query.sportsname

这是为了从查询字符串中获取参数。

正如其他人在 cmets 中提到的,您应该使用 req.params.sportsname
另一种方法是使用 `req.param('sportsname')

这将按以下顺序查找参数:

  • req.params
  • req.body
  • req.query

不过,这是一个小问题

我看到的一个问题是你的sportsname 中有空格/大写

"sportsname":"Lawn Tennis",

但您通过 URL 参数传递这些 - “/user/id/explore/Lawn Tennis” 不是有效的有效 url,将被编码为“Lawn%20Tennis”

解决这个问题的一种方法是使用decodeURIComponent -

所以,请尝试将您的查询更改为:

query.where({sportsname:decodeURIComponent(req.params.sportsname)});

(注意我使用req.params 而不是req.query

另一种方法是在文档中存储一个附加元素 -
像sportsnameslug这样的东西- 您将在保存文档时创建的 (例如将“草地网球”转换为“草地网球”)

然后查询那个

【讨论】:

  • 谢谢...但它仍然显示和以前一样。显示完整的文档。它没有过滤。
  • 查询没有被应用 - 做一个 console.log(req.params.sportsname') 看看它是什么
  • ...您是否将 req.query.sportsname 更改为 req.params.sportsname
  • ALex 一个问题如何列出所有通过sportsname过滤的记录
  • 当我在那个时候运行应用程序时,它会显示运动的名称,但我没有得到完整的记录......
猜你喜欢
  • 2018-09-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-29
  • 2015-12-11
  • 2011-03-14
相关资源
最近更新 更多