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不是一个好的解决方案,但在搜索了一周后,我找到了理想的解决方案。如果你好奇的话,看看我的回答。非常感谢您抽出时间,真诚地。你无法想象,当我收到你的信息时,即使它不是正确的答案,那是一种多么美好的感觉。看到你不认识的人试图帮助我们。感觉真好。希望我能再读懂你的话。