检查多个Mongoose集合中特定字段的总和

我正在尝试为餐厅预订mongoose模式,但如果所有collections中的“人物”价值超过50,我不希望人们能够预订。

var reservationSchema = new mongoose.Schema ({ people: Number, date: String, name: String, email: String }); var Reservation = mongoose.model("Reservation", reservationSchema); app.post('/reservation', (req, res) => { var people = parseFloat(req.body.people); var date = req.body.date; var name = req.body.name; var email = req.body.email; var newReservation = {people: people, date: date, name: name, email: email}; Reservation.create(newReservation, (err, newlyCreated) => { if(err) { console.log(err); } else { res.redirect('/'); } }) }); 

如何通过所有的收集过滤来找出当你把所有的值加起来的人数是多less?

您需要使用聚合pipe道来合计人数。 如果计数小于50,则创build新预留,否则显示一些消息。

为此,您可以使用statics方法。

 var reservationSchema = new mongoose.Schema ({ people: Number, date: String, name: String, email: String }); reservationSchema.statics = { createIfSpaceAvailable : function(newReservation, done){ var Reservation = this; Reservation.aggregate([ { $group:{ _id: null, noOfPeople: { $sum: "$people"} } }], function(err, result){ if(err){ return done(err); } else if(result[0].noOfPeople > 50){ // do something } else{ Reservation.create(newReservation, (err, newlyCreated) => { if(err) { return done(err); } else { return done(); } }) } }) } }; var Reservation = mongoose.model("Reservation", reservationSchema); app.post('/reservation', (req, res) => { var people = parseFloat(req.body.people); var date = req.body.date; var name = req.body.name; var email = req.body.email; var newReservation = {people: people, date: date, name: name, email: email}; Reservation.createIfSpaceAvailable(newReservation, (err, newlyCreated) => { if(err) { console.log(err); } else { res.redirect('/'); } }) }); 

您可以使用聚合pipe道 – 请参阅:

特别是$sum操作符:

顺便说一句,从节点v4.x而不是写:

 var newReservation = {people: people, date: date, name: name, email: email}; 

你可以使用更短的语法:

 var newReservation = {people, date, name, email}; 

看到: