Я отслеживаю результаты игроков, чтобы зафиксировать рост. Моя схема выглядит следующим образом:
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 } ]