2017-05-30 54 views
1

我试图为餐馆预订猫鼬模式,但我不希望人们能够预订,如果“人物”的价值超过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('/'); 
     } 
    }) 
}); 

如何过滤所有集合以查找当您将所有人的值加起来时的数字是多少?

回答

1

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

为此,您可以使用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('/'); 
     } 
    }) 
}); 
+0

为什么'_id:null'? –

+0

@TalhaAwan谢谢你的回答,但我得到TypeError:无法读取未定义的属性'noOfPeople'。 – JKshort

+0

@JKshort,'console.log(result)'检查数据的返回方式。我不确定它是'result.noOfPeople'或'result [0] .noOfPeople' –

0

可以使用聚合管道 - 参见:

并专门$sum操作:

顺便说一句,由于节点4.x版,而不是写:

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

,你可以使用更短的语法:

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

参见: