如何使用带有可选参数的Mongoosejs'find'函数?

时间:2015-11-01 10:47:02

标签: node.js mongodb mongoose

我正在尝试建立一个基本的房产列表网站。本网站有以下过滤器:

  • 卧室数
  • 浴室数量

这两个过滤器都是完全可选的。您可以单独使用,也可以根本不使用。例如,用户可以指定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尝试在数据库中搜索将这些变量分配给''的条目。

请您指出正确的方向,以便在其中一个过滤值留空时我能达到预期的效果吗?

2 个答案:

答案 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
    });
});