2013-12-19 2 views
4

Я эту схему, MongooseДобавить несколько полей в MapReduce с Мангуста и NodeJS

var SessionSchema = mongoose.Schema({ 
    id: Number, 
    cure: { 
     type: mongoose.Schema.Types.ObjectId, 
     ref: 'Cure' 
    }, 
    performances: Array, 
    startDate: Date, 
    endDate: Date, 
    validatee: Boolean, 
    deleted: Boolean 
}); 

мне нужно знать, сколько документов имеют разные идентификаторы, но мне нужно только те, которые имеют startDate больше заданной даты (например, сегодня). Выполнение следующего кода работает нормально, но я хочу добавить некоторые поля на карте, чтобы использовать их в запросе.

var o = {}; 
       o.map = function() { 
        emit(this.id, 1 
         // list other fields like above to select them 
        ) 
       } 
       o.reduce = function (k, vals) { 
        return vals.length 
       } 
       o.out = { 
        replace: 'createdCollectionNameForResults' 
       }; 
       o.verbose = true; 

       Session.mapReduce(o, function (err, model, stats) { 
        console.log('map reduce took %d ms', stats.processtime) 
        console.log("MapReduce" + JSON.stringify(model)); 

        model.find().exec(function (err, docs) { 
         console.log(docs); 
        }); 
       }); 

Это мой выход:

[ { _id: 0, value: 2 }, 
    { _id: 1, value: 4 }, 
    { _id: 2, value: 2 } ] 

Я пытаюсь сделать это:

.... 
    o.map = function() { 
         emit(this.id, { 
          startDate: this.startDate 
         }) 
        } 

.... 

model.find({ 

    startDate: { 
       "$gte": new Date() 
       } 
    }).exec(function (err, docs) { 
         console.log(docs); 
        }); 
.... 

, но я получаю тот же результат.

Как я могу добавить дополнительные параметры ключа из функции отображения в словарь результатов функции сокращения?

+0

Вы пробовали использовать структуру агрегации, а не в MapReduce? – WiredPrairie

+0

Я также не уверен, что 'model' находится в последнем запросе? Коллекция с уменьшением карты будет равна 'value.startDate' – WiredPrairie

+0

К сожалению, я не получаю вас, модель ссылается на' Session schema' – jay

ответ

0

Это решение:

var o = {}; 
       o.map = function() { 
        emit(this.id, { 
         startDate: this.startDate, 
         cure: this.cure, 
         test: 'test' 
         // list other fields like above to select them 
        }) 
       } 
       o.reduce = function (k, vals) { 
        return { 
         n: vals.length, 
         startDate: vals[0].startDate, 
         cure: vals[0].cure, 
         test: vals[0].test 
        } 
       } 
       o.out = { 
        replace: 'createdCollectionNameForResults' 
       }; 
       o.verbose = true; 



    Session.mapReduce(o, function (err, model, stats) { 
      console.log('map reduce took %d ms', stats.processtime); 
      model.find({ 
       'value.cure':mongoose.Types.ObjectId('52aedc805871871a32000004'), 
       'value.startDate': { 
        "$gte": new Date() 
       } 

      }).exec(function (err, docs) { 
       if(!err) 
       console.log(docs.length); 
      }); 
     }); 
+1

Если вы действительно не заботитесь о документах, которые не соответствуют запросу на дату, вы также может определять 'o.query' для предварительной фильтрации документов, которые подаются в функции map/reduce. – robertklep

Смежные вопросы