我不确定递归查询的性能影响,但这样的事情应该可以工作。它从查询中删除最后一个属性,如果没有找到匹配项,则再次尝试:
var AnimalSchema = new mongoose.Schema({
atype: { type: String },
color: {type:String},
pattern: {type:String},
size : {type:String}
});
var Animal = mongoose.model('Animal',AnimalSchema);
//test data
//var dalmation = new Animal({
// atype:'dog',
// color: 'black and white',
// pattern: 'spots',
// size: 'big'
//});
//dalmation.save(function(err){
// var yorkie = new Animal({
// atype:'dog',
// color:'brown',
// pattern:'mixed',
// size:'small'
// });
// yorkie.save(function(yer){
// bestMatch({'atype':'dog','size':'big','color':'brown'},function(err,animal){
// console.log(err,animal);
// })
// });
//});
function bestMatch(params,cb){
Animal.findOne(params,function(err,animal){
if (err || !animal){
var keys = Object.keys(params);
if (keys.length){
delete params[keys.pop()];
bestMatch(params,cb);
}else{
cb('No matches',null);
}
}else{
cb(null,animal);
}
});
}
bestMatch({'atype':'dog','size':'big','color':'brown'},function(err,animal){
console.log(err,animal);
});