[ '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,因为聚合框架应该更有性能。