我正在尝试建立一个基本的房产列表网站。本网站有以下过滤器:
这两个过滤器都是完全可选的。您可以单独使用,也可以根本不使用。例如,用户可以指定1间卧室并将浴室数量留空。这将返回所有列表,包括1间卧室和任何数量的浴室。
我正在尝试使用MongooseJs实现上述场景。我的架构定义如下:
var listing = new Schema({
bathrooms: Number,
bedrooms: Number,
});
当用户使用过滤器时,我的Node,Express服务器上使用以下代码:
var bedrooms = req.param('bedrooms');
var bathrooms = req.param('bathrooms');
Listing.find({
bedrooms: bedrooms,
bathrooms: bathrooms
}, function(err, filterdListings) {
res.render('listings', {
title: 'Listings',
listings: filterdListings
});
})
以下是我的问题所在,我的变量:上面的卧室和浴室,可以留空。这导致Mongoose尝试在数据库中搜索将这些变量分配给''的条目。
请您指出正确的方向,以便在其中一个过滤值留空时我能达到预期的效果吗?
答案 0 :(得分:1)
你可以试试。
var bedrooms = req.param('bedrooms');
var bathrooms = req.param('bathrooms');
var myFilter = {};
if bedrooms {
myFilter.bedrooms = bedrooms;
}
if bathrooms {
myFilter.bathrooms = bathrooms;
}
Listing.find( myFilter, function(err, filterdListings) {
res.render('listings', {
title: 'Listings',
listings: filterdListings
});
})
我无法测试,因此它没有保修;)
答案 1 :(得分:0)
我假设您正在使用GET请求(基于req.params)。我会将其更改为POST请求。您的路线可能如下所示:
/api/filter/:bedrooms?/:bathrooms?
在您提出的问题中,您提到卧室和浴室都是可选的。当用户过滤浴室但将卧室留空时,将触发以下路线:
/api/filter/3
用户过滤3间浴室,但您的功能认为他过滤了3间卧室。
话虽如此,我会在POST请求中发送这两个参数。你的postdata将如下所示:
{
bedrooms: 3,
bathrooms: 3
}
当用户只输入1个过滤器时,您只会发送此属性。您的查询本身看起来像@TechImpossible的答案。
var bedrooms = req.param('bedrooms');
var bathrooms = req.param('bathrooms');
var query = {};
if(req.body.hasOwnProperty('bedrooms')) {
query.bedrooms = req.body.bedrooms;
}
if(req.body.hasOwnProperty('bathrooms')) {
query.bathrooms = req.body.bathrooms;
}
Listing.find(query, function(err, filterdListings) {
res.render('listings', {
title: 'Listings',
listings: filterdListings
});
});