Mongodbfind最佳匹配

我想build立一个查询,返回数据库中最好的匹配文档。

即我想find一个具有以下领域的文件 – “动物”:“狗”“颜色”:“棕色”“模式”:“点”“尺寸”:“小”

如果没有包含所有上述字符和相应值的文档,我希望查询返回最佳匹配。 fe {“animal”:“dog”,“color”:“brown”,“size”:“small”}

我可以在mongo db中实现recursion查询吗? 如果是这样,怎么样? 我应该使用mapreduce,如果是的话,怎么样? 可以把这个问题更多地看作是推荐系统问题,我希望推荐最适合于给定值的项目(文档),如果有人知道实现上述方法的好方法,我将不胜感激

我使用的是mongodb mongoose和nodejs。

谢谢。

我不确定recursion查询的性能影响,但这样的事情应该工作。 它从查询中删除最后一个属性,如果找不到匹配,则再次尝试:

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); }); 

鉴于您似乎只search文本字段,一种可能性是使用MongoDB 2.4中的新(和当前“实验”) 文本searchfunction 。 这允许您在一个或多个字段上创build全文索引,包括相关性的字段权重 。

例如:

 db.collection.ensureIndex( // Fields to index { animal: "text", color: "text", pattern: "text", size: "text" }, // Options { name: "best_match_index", // Adjust field weights (default is 1) weights: { animal: 5, // Most relevant search field size: 4 // Also relevant } } ) 

结果将按照与相关字段权重相关的评分顺序返回。

请注意,search关键字也被阻止 ,所以如果您期待完全匹配,这可能会有一些意想不到的结果。 你可以把你的术语放在双引号中,以利用短语匹配来进行更具体的匹配。

Interesting Posts