gpt4 book ai didi

arrays - 嵌入数组对象更改时,Mongoose 实例 .save() 不工作

转载 作者:可可西里 更新时间:2023-11-01 09:10:30 26 4
gpt4 key购买 nike

我正在使用 Mongoose npm 模块来管理 mongodb。这是我要更新的 mongodb 集合的架构。

var UserSchema = new Schema({
username: {
type: String,
unique: true,
required: true
},
email: {
type: String,
unique: true,
required: true
},
cards: []
});
module.exports = mongoose.model('User', UserSchema);

在post请求里面,这里的req是post请求的请求对象。 res 为响应对象。

User.findById(userID).exec(function (err, doc) {
let cardInfo = req.cardInfo
let cardIndex = req.cardIndex
doc["cards"][0] = cardInfo;
console.log(doc)
/* here I got right doc object as I requested
{
"_id": "59f3bdd488f912234fcf06ab",
"email": "test@gmail.com",
"username": "test",
"__v": 2,
"cards": [
{
"testNo": "42424242424242"
}
]
}
*/
doc.save(function (err) {
if (err) {
return res.json({
success: false,
msg: 'Card add error'
});
}
res.json({
success: true,
msg: 'Successful updated card.'
});
});
})

我收到消息“成功更新卡。”,但实际上,它并没有保存。如何解决。谢谢。

最佳答案

问题是 mongoose 不知道你的数组被修改了。

您可以使用 2 种解决方案:

标记已修改

This function将嵌入元素标记为已修改并强制重新保存它。它会告诉 mongoose 重新保存这个元素。

User.findById(userID).exec(function (err, doc) {
let cardInfo = req.cardInfo
let cardIndex = req.cardIndex
doc["cards"][0] = cardInfo;
console.log(doc)
/* here I got right doc object as I requested
{
"_id": "59f3bdd488f912234fcf06ab",
"email": "test@gmail.com",
"username": "test",
"__v": 2,
"cards": [
{
"testNo": "42424242424242"
}
]
}
*/
doc.markModified('cards');
doc.save(function (err) {
if (err) {
return res.json({
success: false,
msg: 'Card add error'
});
}
res.json({
success: true,
msg: 'Successful updated card.'
});
});
})

使用完整架构。

为避免 markModified 技巧,您应该在架构中描述卡片的内容。这样 mongoose 将能够确定是否需要保存该字段。

这是正确声明模式的方法:

const CardSchema = new Schema({
testNo: String,
});

var UserSchema = new Schema({
username: {
type: String,
unique: true,
required: true
},
email: {
type: String,
unique: true,
required: true
},
cards: [CardSchema]
});
module.exports = mongoose.model('User', UserSchema);

这样, Mongoose 将能够检测到卡片中的值是否发生了变化,并仅保存修改后的项目。

如果你能做到(静态模式),这显然是实现它的好方法。

关于arrays - 嵌入数组对象更改时,Mongoose 实例 .save() 不工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47123599/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com