Express Mongoose,findByIdAndUpdate,更新除一个之外的所有?

Express Mongoose,findByIdAndUpdate,更新除一个之外的所有?,express,mongoose,Express,Mongoose,我不明白,但当用户被创建时,日期意味着帐户创建的日期。但是当用户更新他们的信息时,“日期”也在更新。我做错了什么 我的模型: var userinfoSchema = new mongoose.Schema({ type_ : String, firstname : String, surname : String, organization : String, name : String, perso

我不明白,但当用户被创建时,日期意味着帐户创建的日期。但是当用户更新他们的信息时,“日期”也在更新。我做错了什么

我的模型:

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');
        }
    });
});  

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

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(/*...*/);
  });
});

在搜索了一周后,我认为这是最好的答案…

从Mongoose 4.0开始,您现在可以在模式上设置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 });
var UserSchema = new mongoose.Schema({
    username: String,
    password: String,
    userinfo: [userinfoSchema]
}, { createdAt: 'date', updatedAt: 'update_date' });
比如,我们可以看到:date:{type:date,default:date.now}不是一个很好的选择

时间戳创建两个字段:“createdAt”和“updatedAt”,如下图所示:

注:我们也可以通过“日期”或类似的方式更改“createdAt”:

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 });
var UserSchema = new mongoose.Schema({
    username: String,
    password: String,
    userinfo: [userinfoSchema]
}, { createdAt: 'date', updatedAt: 'update_date' });

您的意思是更新收藏时,您的
日期也会更新?然后你有一个
preUpdate
callback-elsewhere是的,它就是它。例如,当用户更新其电话号码时。日期也会更新。不清楚您想要什么,但从它的声音来看,您希望
Date
字段在每次更新时使用
pre
/
post
中间件自动更新。是这样吗?如果是这样,请包括您定义的中间件。@c1more您好,不,这不是我想要的,对不起,我的英语不好。我想用户可以更新每一个字段,当他将点击“保存”时,“日期”保持不变。因为日期的意思是:注册日期。您好@c1more,我尝试了您的解决方案,但似乎不起作用。req.body.userinfo[0].date不是一个好的解决方案,但在搜索了一周后,我找到了理想的解决方案。如果你好奇的话,看看我的回答。非常感谢您抽出时间,真诚地。你无法想象,当我收到你的信息时,即使它不是正确的答案,那是一种多么美好的感觉。看到你不认识的人试图帮助我们。感觉真好。希望我能再读懂你的话。