【问题标题】:Adding/Removing elements in Mongoose accordingly相应地在 Mongoose 中添加/删除元素
【发布时间】:2017-01-08 04:40:10
【问题描述】:

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

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

用户会看到一个俱乐部列表,每个列表都有一个发送到 mongodb 的表单,该表单可以跟踪为该特定俱乐部保留的其他用户。

我已经制作了Clubs 的架构

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

其中 clubID 是俱乐部的 ID,guests 只是一个用于跟踪用户名的字符串数组。

我想做以下事情:

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

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

3) 如果clubID 存在并且userName 也存在于guests 中,则从guests 中删除该userName

我有以下伪代码:

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"})
    })
  })
}

【问题讨论】:

  • 你想要什么?
  • 基本按照1)2)3)的逻辑进行

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


【解决方案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);
        }
    ); 

}

干杯:)

【讨论】:

    【解决方案2】:

    如果我正确理解您的问题,您的所有代码都按预期工作,只是您想知道如何更新特定的俱乐部条目。为此,只需修改 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) {
      ...
    };
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-06-17
      • 2014-04-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-23
      相关资源
      最近更新 更多