带有可能的空参数的find()语句

我试图弄清楚Mongoose和MongoDB是如何工作的…我对他们来说真的很陌生,我似乎无法想象如何根据find语句返回值,其中查询中的某些给定参数可能是空 – 是否有一个属性,我可以为此设置或什么?

为了进一步解释,我有一个网页,有不同的input字段,用于search公司,但他们不是所有的强制性。

var Company = mongoose.model('Company'); Company.find({companyName: req.query.companyName, position: req.query.position, areaOfExpertise: req.query.areaOfExpertise, zip: req.query.zip, country: req.query.country}, function(err, docs) { res.json(docs); }); 

通过填写网页上的所有input字段,我得到一个结果,但只有那个匹配的特定的一个。 假设我只填写country ,它什么也没有返回,因为其余的都是空的,但是我希望返回所有在德国的行。 我希望我清楚地expression自己。

例如,您需要使用$or逻辑运算符来包装查询

 var Company = mongoose.model('Company'); Company.find( { "$or": [ { "companyName": req.query.companyName }, { "position": req.query.position }, { "areaOfExpertise": req.query.areaOfExpertise }, { "zip": req.query.zip }, { "country": req.query.country } ] }, function(err, docs) { res.json(docs); } ); 

另一种方法是构造一个查询来检查空参数,如果它们不是null,则将其作为查询的一部分包含在查询中。 例如,您可以使用req.query对象作为查询,假定键与文档字段相同,如下所示:

 /* the req.query object will only have two parameters/keys eg req.query = { position: "Developer", country: "France" } */ var Company = mongoose.model('Company'); Company.find(req.query, function(err, docs) { if (err) throw err; res.json(docs); }); 

在上面的req.queryreq.query对象充当查询,并且有一个隐含的逻辑AND操作,因为当指定一个用逗号分隔的expression式列表时,MongoDB提供了一个隐式AND操作。 当需要在多个expression式中指定相同的字段或运算符时,使用与$and运算符的显式AND是必要的。


如果您的查询符合逻辑“ AND和“ OR即返回符合两个条款条件的所有文档,例如查询positioncountry或任何其他字段,则可以将查询调整为:

 var Company = mongoose.model('Company'); Company.find( { "$or": [ { "companyName": req.query.companyName }, { "position": req.query.position, "country": req.query.country }, { "areaOfExpertise": req.query.areaOfExpertise }, { "zip": req.query.zip } ] }, function(err, docs) { res.json(docs); } ); 

但是这又可能受到什么查询参数需要被连接为强制等。

我只是最后删除查询中的参数,以防它们为空。 似乎提交中的所有文本字段都以“”(空)提交。 由于在数据库中没有这样的值,它将不会返回任何值。 这么简单,它永远不会跨越我的脑海

例:

 if (req.query.companyName == "") { delete req.query.companyName; }