[ 'fruit', 'citrus' ]
{
    title: 'Apples',
    tags: [ 'fruit' ]
},

{
    title: 'Oranges',
    tags: [ 'fruit', 'citrus' ]
},

{
    title: 'Potato',
    tags: [ 'vegetable' ]
}

现在,我想根据每个条目与标记模式的匹配百分比对集合进行排序。橘子第一,苹果第二,土豆最后。
最有效最简单的方法是什么?

最佳答案:

从MongoDB 2.1开始,可以使用聚合框架完成类似的计算。语法类似于

db.fruits.aggregate(
     {$match : {tags : {$in : ["fruit", "citrus"]}}}, 
     {$unwind : "$tags"}, 
     {$group : {_id : "$title", numTagMatches : {$sum : 1}}}, 
     {$sort : {numTagMatches : -1}} )

又回来了
 {
   "_id" : "Oranges",
   "numTagMatches" : 2
 },
 {
   "_id" : "Apples",
   "numTagMatches" : 1
 }

这应该比map reduce方法快得多,原因有二。首先,因为实现是本地的C++而不是JavaScript。其次,因为“$match”将过滤掉根本不匹配的项(如果这不是您想要的,您可以省略“$match”部分,并将“$sum”部分更改为1或0,具体取决于标记是否等于“水果”或“柑橘”或两者都不等于)。
这里唯一需要注意的是Mongo2.1还不推荐用于生产。如果在生产中运行,则需要等待2.2版。但如果你只是在自己尝试,你可以玩2.1,因为聚合框架应该更有性能。