мангуста mapreduce () - PullRequest
       9

мангуста mapreduce ()

1 голос
/ 13 января 2012

Я отслеживаю результаты игроков, чтобы зафиксировать рост. Моя схема выглядит следующим образом:

Schema = new schema({
    pid: { type: Number }
  , name: { type: String }
  , alliance: {
      aid: { type: Number }
    , name: { type: String }
    }
  , city_cnt: { type: Number }
  , score: { type: Number }
  , rank: { type: Number }
  , createdTimeAt: { type: Date, default: Date.now }
  , createdDayAt: { type: Number, default: function() { return Math.floor(Date.now() / (24 * 60 * 60)) } }
})

Теперь я хочу вытащить по одной записи в день (последний записанный счет за этот день) на игрока. Итак, у меня есть эта карта уменьшить:

growthMap = function(){
  emit('createdTimeAt', this.createdTimeAt.toString())
}

growthReduce = function(prev, doc) { 
  if (doc.createdTimeAt > prev.createdTimeAt) {
    prev.createdTimeAt = doc.createdTimeAt
    prev.score = doc.score

    prev.pid = doc.pid
    prev.name = doc.name
  }
}

mongoose.connect('mongodb://localhost/my_database')
mongoose.model('Players', Schema)

mongoose.connection.db.executeDbCommand({
  mapreduce: 'players'
, map: growthMap.toString()
, reduce: growthReduce.toString()
, out: 'playerGrowth'
}, function(err, ret){ 
  if (err) console.log(err)
  else {
    console.log(ret.documents)
    mongoose.connection.db.collection('playerGrowths', function(err, collection){
      collection.find({}).toArray(function(err, docs){
        console.dir(docs)
      })

    })
  }
})

Кажется, что уменьшение карты работает нормально. Первый вывод console.log (ret.documents) дает такой результат:

[ { result: 'playerGrowth',
    timeMillis: 11268,
    counts: { input: 14635, emit: 14635, reduce: 15, output: 1 },
    ok: 1 } ]

Однако всякий раз, когда я пытаюсь запросить новую коллекцию во втором выводе console.log (docs) , я получаю пустой массив без результатов. Я уверен, что делаю что-то не так, но документация мангуста отсутствует, когда дело доходит до mapreduce.

EDIT

Согласно приведенному ниже ответу Джеда, я изменил mongoose.connection.db.collection ('playerGrowths' на mongoose.connection.db.collection ('playerGrowth' и я нахожусь на меньше всего получаю результат из find ({}). toArray (). Однако это все-таки не то, что я ожидаю или нужно ...

Мои новые результаты

[ { result: 'playerGrowth',
    timeMillis: 5743,
    counts: { input: 14635, emit: 14635, reduce: 15, output: 1 },
    ok: 1 } ]
null
[ { _id: 'createdTimeAt', value: null } ]

Ответы [ 3 ]

0 голосов
/ 16 марта 2012

Результатом mapreduce является просто некоторая диагностика.Теперь вам нужно запросить коллекцию playerGrowth для получения реальных результатов.

0 голосов
/ 22 мая 2014

Функция emit () должна возвращать пару ключ-значение. Так как ваш «ключ» - это «createTimeAt», он собирает результаты. Вы, вероятно, должны сделать:

emit(this.createdTimeAt.toString(), <your value>)
0 голосов
/ 13 января 2012

Попробуйте изменить:

mongoose.connection.db.collection('playerGrowths'...

Кому:

mongoose.connection.db.collection('playerGrowth'...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...