[英]document wont save using save() method with mongoose
我有这个架构:
var UserSchema = mongoose.Schema({
analytic: {
type: Object,
default: {
today:[],
weekly:[],
monthly:[],
yearly:[],
allTime:[]
}
}
});
let User = mongoose.model("bloger", UserSchema);
module.exports = {User};
我正在尝试将一些数据保存到数组之一中,如下所示:
User.findOne({username:username}, (e, user) => {
if (e) {
res.send('error fetching post')
}
else if (!user) {
res.send('no user found')
}
else if (user) {
user.analytic.today.push(req.body.visitor) // push the data object to the array
user.save((e, doc) => {
if (e) {
res.send(e)
}
if (doc) {
console.log('user saved')
res.send(doc)
}
})
}
})
})
我在save()
而不是e
上获得了doc
对象,所以我虽然应该保存它,但事实并非如此。
在此之前,我曾遇到过类似的问题,因为我没有定义新模型,而只是传递了JSON对象。
无需保存对象,您需要创建一个新模型并将其保存。
尝试创建一个新模型,将保存内容传递给它,如下所示;
var newUser = new User(user);
newUser.save((e, doc) {
if (e) {
res.send(e)
}
if (doc) {
console.log('user saved')
res.send(doc)
}
});
确保在脚本中需要用户模型。
对不在您架构中的对象执行深层修改会使Mongoose忽略这些更改,从而使其无法知道要保存的内容(以及进行有效的原子更新)。 最终结果是,当调用.save
,Mongoose认为没有任何修改,因此什么也不做。
在您的特定情况下,您有两个选择:
analytics
子数组添加到架构 这是最好的选择,可以对所有内容进行更好的控制:
const UserSchema mongoose.Schema({
analytic: {
today: [{}],
weekly: [{}],
monthly: [{}],
yearly: [{}],
allTime: [{}],
}
});
这样,Mongoose现在就知道了这些数组,并且一切都应该正常工作。
请注意,在这种情况下,您不需要默认值,因为Mongoose足够聪明,可以根据需要创建阵列。
如果出于某种原因您不希望或无法修改架构,则可以手动将analytic
对象标记为已修改,以便Mongoose知道:
user.analytic.today.push(req.body.visitor) // push the data object to the array
user.markModified('analytic'); // mark field as modified
user.save(...);
这表示Mongoose analytic
或它的任何子级已更改,并在调用.save
时触发更新。 但是请注意,Mongoose将此视为对象的完整更改,而对于选项1,它可以使用$push
代替。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.