ああ、私は解決策を見つけました。 MongoDBのaggregate
フレームワークを使用すると、コレクションに対して一連のタスクを実行できます。特に注目すべきは$unwind
、ドキュメント内の配列を一意のドキュメントに分割します 、グループにすることができる/まとめて数える 。
MongooseJS これをモデル上で非常にアクセスしやすく公開します。上記の例を使用すると、これは次のようになります。
Thing.aggregate([
{ $match: { /* Query can go here, if you want to filter results. */ } }
, { $project: { tokens: 1 } } /* select the tokens field as something we want to "send" to the next command in the chain */
, { $unwind: '$tokens' } /* this converts arrays into unique documents for counting */
, { $group: { /* execute 'grouping' */
_id: { token: '$tokens' } /* using the 'token' value as the _id */
, count: { $sum: 1 } /* create a sum value */
}
}
], function(err, topTopics) {
console.log(topTopics);
// [ foo: 4, bar: 2 baz: 2 ]
});
約200,000レコードにわたる予備テストでは、MapReduceよりも著しく高速であるため、スケーリングが向上する可能性がありますが、これはざっと見ただけです。 YMMV。