我的node.js / mongodb应用程序中有一个简单的问题。在请求/api/house
时,我无条件地想要所有房屋,并且在请求/api/house?rooms=2&area=100
时,我只想要有两个房间并且面积为100的房屋。
我的数据库包含许多字段为area
且rooms
为null
或undefined
的房屋,所以我想在请求所有房屋时匹配这些字段。否则,请使用指定的参数值。我不知道该怎么做。
我的相关代码是:
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 }
答案 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}})
然后继续使用您的代码!希望我帮忙!