Начиная с 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
}
Это должно быть намного быстрее, чем метод уменьшения карты по двум причинам. Во-первых, потому что реализация является родным C ++, а не javascript. Во-вторых, потому что «$ match» отфильтрует элементы, которые не совпадают вообще (если это не то, что вы хотите, вы можете пропустить часть «$ match» и изменить часть «$ sum» на 1 или 0 в зависимости от того, равен ли тег «фрукты» или «цитрусовые» или нет).
Единственное предостережение: монго 2.1 пока не рекомендуется для производства. Если вы работаете в производстве, вам нужно подождать 2.2. Но если вы просто экспериментируете самостоятельно, вы можете поиграть с 2.1, поскольку структура агрегации должна быть более производительной.