使用Mongoose+Express时,location为ALL如何返回全部数据?
解决Mongoose动态查询的小技巧
嘿,这个场景太常见啦!你现在的问题是当location参数为"ALL"时,代码会去查Location.City等于"ALL"的记录,但我们想要的是返回所有数据对吧?其实只要动态构建查询条件就能轻松搞定,具体思路和修改如下:
- 先初始化一个空的查询对象,用来存放动态的筛选规则
- 判断请求参数里的
location是不是不等于"ALL":如果是具体城市名,就把'Location.City'的筛选条件加到查询对象里;如果是"ALL",查询对象保持为空,这样Mongoose就会返回所有数据 - 最后把这个动态生成的查询对象传给
Property.find(),分页、排序的逻辑完全不用改动
修改后的代码示例:
// 动态构建查询条件 let query = {}; if (request.params.location !== "ALL") { query['Location.City'] = request.params.location; } Property.find(query, function(err, allProperties) { if (err) { console.log(Date() + " - ERROR Occured: " + err); } else { response.render("propertiesView", { properties: allProperties, propertiesCount: allProperties.length, moment: moment }); } }) .skip(request.params.page * 10) .limit(10) .sort({ PostDate: -1 });
这样调整后,当location是"ALL"时,find()接收的是空对象,Mongoose就会跳过City的筛选,返回所有符合分页和排序规则的数据;当location是具体城市名时,才会按照指定城市过滤结果。
另外小提一句:如果担心用户传入的参数大小写不统一(比如小写的"all"),可以把判断逻辑改成request.params.location.toUpperCase() !== "ALL",这样兼容性会更好~
内容的提问来源于stack exchange,提问作者Mihai Zhao
相关产品推荐
相关产品推荐

