相应地添加/删除Mongoose中的元素

时间:2017-01-07 19:17:10

标签: javascript node.js mongodb mongoose mongoose-schema

我是Mongo / Mongoose的新手,我无法执行以下操作:

我正在创建一个简单的应用程序,它利用Yelp API查找用户可以搜索的区域周围的夜总会/酒吧。

向用户显示一个俱乐部列表,每个列表都有一个表格发送给mongodb,可以跟踪为该特定俱乐部保留的其他用户。

我制作了Clubs

的架构
const clubSchema = new Schema({
  clubID: String,
  guests: [String]
})

其中clubID是俱乐部的ID,而客人只是一系列字符串,可以跟踪用户名。

我想做以下事情:

1)当数据库中存在特定的clubID时,它会创建一个新的并在userName

中插入guests

2)如果clubID存在并且userNameguests不存在(意味着它是不同的用户),则会推送userName进入guests数组

3)如果clubID存在且userName中也存在guests,请从userName

中删除guests

我有以下伪代码:

exports.UpdateGuestList = function(req, res, next){
  const clubID = req.params.clubID;
  const userName = req.params.userName
  const userEmail = req.params.userEmail;

  Club.findOne({ clubID: clubID}, function(err, existingClub){
    if (err) { return next(err) ;}
    // if clubID exist in the data base, check the following
    if (existingClub){
                     //1) if the current userName exist, remove it from guests array
      if (existingClub.guests.includes(userName)){
        console.log('Remove guest')
      } else{         //2) if the current userName doesnt exist, push it into guests aaray
        console.log('Push in gueest')
      }
      return res.send({"message": "done"})
    }

    // If clubID does not exist, create and save clubID
    const club = new Club({
      clubID: clubID,
      guests: [userName]
    })

    club.save(function(err){
      if (err) {return next(err)}
      res.send({"message": "done"})
    })
  })
}

2 个答案:

答案 0 :(得分:1)

试试这个:

if (existingClub.guests.includes(userName)){

  Club.findByIdAndUpdate(
        clubID,
        {$pull: {"guests": userName}},
        {safe: true, upsert: true, new : true},
        function(err, model) {
            console.log(err);
        }
    );
}
else
{
  console.log('Push in gueest')
  Club.findByIdAndUpdate(
        clubID,
        {$push: {"guests": userName}},
        {safe: true, upsert: true, new : true},
        function(err, model) {
            console.log(err);
        }
    ); 

}

干杯:)

答案 1 :(得分:1)

如果我正确理解您的问题,您的所有代码都按预期工作,只是您想知道如何更新特定的分会条目。要执行此操作,只需修改javascript对象,然后save()即可。

exports.UpdateGuestList = function(req, res, next){
  const clubID = req.params.clubID;
  const userName = req.params.userName;
  const userEmail = req.params.userEmail;

  Club.findOne({ clubID: clubID}, function(err, club){
    if (err) {return next(err);}
    // if clubID exist in the data base, check the following
    if (club){

      if (club.guests.includes(userName)){
        //1) if the current userName exist, remove it from guests array
        const userIndex = club.guests.findIndex(function (guest) {
          return guest === userName;
        });
        club.guests.splice(userIndex, 1);
      } else{
        //2) if the current userName doesnt exist, push it into guests array
        club.guests.push(userName);
      }

    } else {
      // If clubID does not exist, create and save clubID
      club = new Club({
        clubID: clubID,
        guests: [userName]
      });
    }

    club.save(function(err){
      if (err) {return next(err);}
      res.send({"message": "done"});
    });
  });
};

您还应该考虑将此方法作为静态方法添加到模式声明中,而不是将此方法包含在单独的库中。有关详细信息,请参阅http://mongoosejs.com/docs/guide.html。它可能在您的clubSchema文件中看起来像这样:

const clubSchema = new Schema({
  clubID: String,
  guests: [String]
});

clubSchema.statics.UpdateGuestList = function (clubId, userName) {
  ...
};