我想构建一个查询,返回数据库中最匹配的文档。
即我想查找包含以下字段的文档 - “动物”:“狗” “颜色”:“棕色” “图案”:“点” “尺寸”:“小”
如果没有包含上述所有字段及其对应值的文档,我希望查询返回最佳匹配。 f.e {"animal":"dog", "color":"brown", "size":"small"}
我可以在 mongo db 中实现递归查询吗?如果是这样,如何? 我应该使用 mapReduce,如果是,如何使用? 人们可以将这个问题更多地看作是一个推荐系统问题,就像我想推荐最适合给定值的项目(文档)一样,如果有人知道实现上述内容的好方法,我将不胜感激
我正在使用 mongodb mongoose 和 nodejs。
谢谢。
最佳答案
我不确定递归查询对性能的影响,但这样的事情应该可行。它从查询中删除最后一个属性,如果未找到匹配项,则重试:
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);
});
关于node.js - Mongodb 找到最佳匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15863141/