【问题标题】:Mongoose, findByIdAndUpdate, Update all except one?Mongoose,findByIdAndUpdate,更新除一个之外的所有?
【发布时间】:2022-02-15 08:54:10
【问题描述】:

我不明白,但是当创建用户时,日期是指创建帐户的日期。但是当用户更新他们的信息时,“日期”也会更新。我究竟做错了什么?

我的模特:

var userinfoSchema = new mongoose.Schema({
    type_        : String,
    firstname    : String,
    surname      : String,
    organization : String,
    name         : String,
    person_role  : String,
    members_num  : Number,
    address      : String,
    postal_code  : String,
    city         : String,
    country      : String, 
    tel          : String,
    date: { type: Date, default: Date.now }
});

var UserSchema = new mongoose.Schema({
    username: String,
    password: String,
    userinfo: [userinfoSchema]
});

还有我的应用功能:

app.put("/Edit/:id", function(req,res) {
    User.findByIdAndUpdate(req.params.id, {$set: { userinfo: req.body.userinfo}}, 
    function(err, updated) {
        if(err) {
            res.redirect('/Edit');
        } else {
            console.log(updated);
            res.redirect('/Profil');
        }
    });
});  

【问题讨论】:

  • 您的意思是您的date 在您更新收藏时也会更新?然后你在别处有一个preUpdate 回调
  • 是的,就是这样。例如,当用户更新他的电话号码时。日期也更新了。
  • 这并不完全清楚你想要什么,但从它的声音你期望date 字段在每次更新时使用pre/post 中间件自动更新。对吗?
  • 如果是这种情况,请包含您定义的中间件。
  • @c1moore 你好,不,这不是我想要的,对不起我的英语。我希望用户可以更新每个字段,当他点击“保存”时,“日期”保持不变。因为日期的意思是:注册日期。

标签: express mongoose


【解决方案1】:

有两种方法可以使date 保持不变。第一种也是最简单的方法是清理来自客户端的数据:

app.put("/Edit/:id", (req,res) => {
  delete req.body.userinfo.date;

  User.findByIdAndUpdate(req.params.id, {$set: { userinfo: req.body.userinfo}}, (err, updated) => {
    // ...
  });
});

无论如何,您可能应该在将数据直接保存到数据库之前对其进行清理和验证。

或者,您可以先查询需要更新的文档并使用save()。您的架构将如下所示:

var userinfoSchema = new mongoose.Schema({
  type_        : String,
  firstname    : String,
  surname      : String,
  organization : String,
  name         : String,
  person_role  : String,
  members_num  : Number,
  address      : String,
  postal_code  : String,
  city         : String,
  country      : String, 
  tel          : String,
  date         : {
    type         : Date,
    default      : Date.now,
    set          : (date) => {
      if(this.date) {
        return;
      }

      this.date = date;
    }
  }
});

不过,要更新用户,您需要执行以下操作:

const _ = require('lodash');

app.put("/Edit/:id", (req,res) => {
  delete req.body.userinfo.date;

  User.findById(req.params.id, (err, user) => {
    if(err) {
      // Handle error.
    }

    _.assign(user, req.body.userinfo);

    user.save().then(/*...*/);
  });
});

【讨论】:

  • 您好@c1moore,我尝试了您的解决方案,但似乎不起作用。 req.body.userinfo[0].date 不是一个好的解决方案,但在搜索了一周后,我找到了理想的解决方案。如果您好奇,请参阅下面的我的回答。非常感谢您的宝贵时间,真诚的。你无法想象当我收到你的信息时,即使它不是正确的答案,那是一种多么美好的感觉。看到你不认识的人试图帮助我们。多么好的感觉。希望我能再读一遍。
【解决方案2】:

这是我搜索一周后认为最好的答案...

从 Mongoose 4.0 开始,您现在可以在 Schema 上设置 timestamps 选项,让 Mongoose 为我们处理这个问题:

var thingSchema = new Schema({..}, { timestamps: true });

所以在这种情况下:模型应该是这样的:

var userinfoSchema = new mongoose.Schema({
    type_        : String,
    firstname    : String,
    surname      : String,
    organization : String,
    name         : String,
    person_role  : String,
    members_num  : Number,
    address      : String,
    postal_code  : String,
    city         : String,
    country      : String, 
    tel          : String,
});

var UserSchema = new mongoose.Schema({
    username: String,
    password: String,
    userinfo: [userinfoSchema]
}, { timestamps: true });

就像,我们可以看到 : date: { type: Date, default: Date.now } 不是一个好的选择。

时间戳创建两个字段:“createdAt”和“updatedAt”,如下图所示:createdAt will never change and updatedAt will change evertytime the user will update their datas

注意:我们也可以通过“日期”或其他方式更改“createdAt”:

var UserSchema = new mongoose.Schema({
    username: String,
    password: String,
    userinfo: [userinfoSchema]
}, { createdAt: 'date', updatedAt: 'update_date' });

【讨论】:

    猜你喜欢
    • 2021-10-23
    • 2014-02-19
    • 2013-08-14
    • 2020-08-12
    • 1970-01-01
    • 2018-08-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多