mongooseでMapReduceを実行する

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シンタックスハイライトに対応してほしいんだが。