有条件或没有条件的MongoDB查询

时间:2016-04-27 14:16:50

标签: node.js mongodb mongoose

我的node.js / mongodb应用程序中有一个简单的问题。在请求/api/house时,我无条件地想要所有房屋,并且在请求/api/house?rooms=2&area=100时,我只想要有两个房间并且面积为100的房屋。

我的数据库包含许多字段为arearoomsnullundefined的房屋,所以我想在请求所有房屋时匹配这些字段。否则,请使用指定的参数值。我不知道该怎么做。

我的相关代码是:

app.get('/api/house', function (req, res) {
    House.find({})
    .and([
        { area: new RegExp(req.query.area ? req.query.area : '', 'i') },
        { numberOfRooms: req.query.numberofrooms ? req.query.rooms : { $gte: 0 } }
    ])
    .exec(function (err, estates) {
        if (estates)
            return res.send(estates);
        res.status(500).send({ error: err.message });
    });
});

这适用于具有非空/未定义字段的房屋,因为它们是字符串或数字,但会跳过那些不具有字符串或数字的房屋。

我的House架构:

area: { type: String },
rooms: { type: Number }

3 个答案:

答案 0 :(得分:1)

我会使用这样的查询:

db.houses.find({
    $and: [
        $or: [
            { rooms: 2 },
            { rooms: { $exists: false } },
        ],
        $or: [
            { area: "100" },
            { area: { $exists: false } },
        ],
    ],
});

应该涵盖所有的案例。

答案 1 :(得分:0)

除了AND逻辑之外,还可以使用OR来匹配null和undefined值。 javascript中的单个查询看起来像这样

P.S:您可能需要为下面列出的条件添加一些条件以满足您的需求。

db.houses.find(
    {$or: [
        {rooms:2, area:"100"},
        {rooms:"null", area:"null"},
        {rooms:"undefined", area:"undefined"}
]});

答案 2 :(得分:0)

这样的事情会起作用吗?

House.find({}, function(err, houseArray){ // the find function returns an array
  if(err) throw err;
  if(houseArray.length > 0){
    //your code goes here
  } else if(houseArray.length == 0){
    //notify the user or throw err etc.
  }
})

如果你想要一个特定的参数,你必须写一些像:

House.find({'rooms': 3}) 

或者如果你想要一个特定数字大于或小于你必须做的事情:

House.find({'rooms': {$gt: 0, $lt: 5}}) 

然后继续使用您的代码!希望我帮忙!