使用 Mongoose 以编程方式构建动态查询

Programmatically build dynamic query with Mongoose

我正在尝试根据从表单收到的输入构建搜索。

router.get('/data', function(req, res) {
    var firstName=req.body.firstName,
    lastName=req.body.lastName,
    companyName=req.body.companyName,
    email=req.body.email;
});

我想根据这些值构建查询,但如果该字段没有值,我显然不想将其包含在搜索中(搜索“”会改变结果)

我尝试了几种不同的方法,例如构建一个字符串以放入:

mongoose.model('customers').find({QUERY STRING WOULD GO HERE} ,function(err, data) {
    if (err) return console.error(err);
    console.log(data);
});

但这似乎无法正常工作。我也试过 "stacking" 搜索这样的查询:

if(firstName !="") {
    mongoose.model('customers').find({firstName: firstName})
}

然后像这样执行搜索:

mongoose.model('customers').exec(function(err, customer){
    console.log(customer);
});

但这会导致 500 个错误(我不确定是否可以从他们那里获得更多信息)。

请帮助新手动态构建猫鼬搜索查询:(

尝试创建 query 对象,例如:

//generate query object based on availability of value 
var query = {};
if( your_variable !== "" ) {
    query["some_key"] = your_variable;
}
if( your_second_variable !== "" ) {
    query["some_other_key"] = your_second_variable;
}
mongoose.model('customers').find(query, function(err, c) {
    //do something
});

为避免单独检查每个参数,您可以遍历它们。

var query = {};
for(var key in req.body){ //could also be req.query and req.params
  req.body[key] !== "" ? query[key] = req.body[key] : null;
}

mongoose.model('customers').find(query, function(err, customers){

})

对于使用较新 JavaScript 的人(尤其是 Node.js 7.6.0+ 或 Babel)。

我发现以编程方式构建查询(基于 if 子句等)的最佳方法是使用查询和替代语法。

let query = PersonModel().find();

if (isMale) {
    query.where('sex', 'male'); 
} else {
    query.where('sex', 'female');
}

query.where('alive', true);

// and then to run the query
const result = await query.exec();

请注意此处的 async/await 用法。它在 Node.js 7.6.0+ 上完美运行。如果你不想使用 async/await 你可以像这样使用 Promises:

query.exec().then(result => {
    // result has your... results
});