2015-04-10 3 views
0

У меня есть две схемы объявления:Mongoose - для каждого получить подсчитывать и выберите

var AdvertSchema = new Schema({ 
    created: { 
     type: Date, 
     default: Date.now 
    }, 
    title: { 
     type: String, 
     default: '', 
     trim: true, 
     required: 'title cannot be empty' 
    }, 
    advert: { 
     type: String, 
     default: '', 
     required: 'advert cannot be empty' 
    }, 
    sport: [{ 
     type: Schema.ObjectId, 
     ref: 'Sport' 
    }], 
}); 
mongoose.model('Advert', AdvertSchema); 

и спорта:

var SportSchema = new Schema({ 
    sportName: { 
     type: String, 
     default: '', 
     required: 'sport cannot be empty' 
    } 
}); 
mongoose.model('Sport', SportSchema); 

И я хотел бы знать, как я могу для каждого вида спорта получить счетчик объявлений и выберите _id и sportName схемы спорта. Обратите внимание, что в схеме объявлений есть спорт как массив. Результат должен быть примерно таким:

[{ 
    _idOfSport: "some ID", 
    sportName: "sport name", 
    countOfSportAdverts: "number" 
}, 
etc for other sports... 
] 

Я думаю, я могу использовать структуру агрегации, но я не знаю, как это сделать. Как это можно сделать?

ответ

0

Я предполагаю, что это может сделать трюк:

Sport.find({}, function(err, sports) { 
    var results = [], sportMap = {}; 

    sports.forEach(function(sport) { 
     sportMap["_idOfSport"] = sport._id; 
     sportMap["sportName"] = sport.sportName; 
     Advert.aggregate([ 
      { 
       $match: { 
        sport: sport._id 
       } 
      }, 
      { 
       $group: { 
        _id: null, 
        count: { $sum: 1 } 
       } 
      } 
     ], function(err, res){ 
       sportMap["countOfSportAdverts"] = res[0].count; 
       results.push(sportMap);    
     }); 
    });  
}); 
Смежные вопросы