mongooseでMapReduceを実行しようとして試行錯誤。
ググって最初に出てきたこのコードは何故か動かなかった。
mongoose = require 'mongoose' mapFunc = -> emit(this.md5_hash, 1) reduceFunc = (key, values) -> count = 0 values.forEach (value) -> count += value return count mongoose.connect('mongodb://localhost/dbname') command = { mapreduce: "movies" query: {} map: mapFunc.toString() reduce: reduceFunc.toString() out: 'md5_hashes' } mongoose.connection.db.executeDbCommand command, (err, dbres) -> if !err console.log dbres else console.log err
mapreduceに限らず、mongoose.connection.db.executeDbCommandを使おうとすると、
notConnectedというエラーが帰ってくる。
でも接続は済んでるはずなんだよなあ・・・。
最終的に以下のコードで動いた。
mongoose = require 'mongoose' mapFunc = -> emit(this.md5_hash, 1) reduceFunc = (key, values) -> count = 0 values.forEach (value) -> count += value return count mongoose.connect('mongodb://localhost/dbname') {MovieSchema} = require('./model/movie') mongoose.model('Movie', MovieSchema) Movie = mongoose.model('Movie') Movie.collection.mapReduce mapFunc.toString(), reduceFunc.toString(), {out: {inline: 1}}, (err, val) -> if !err console.log val else console.log err
結局、mongooseモデルを定義して、modelObj.collection.mapReduceを呼ぶことで上手くいった。
mongooseって微妙にドキュメントが少ないよねえ。基本的なところはいいんだけど。
それにしても、はてなは早くCoffeeScriptのシンタックスハイライトに対応してほしいんだが。