我正在使用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 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.'
});
});
})
我收到消息'成功更新卡'。但实际上,它没有保存。 如何解决它。感谢。
答案 0 :(得分:6)
问题是你的阵列的猫鼬没有被修改。
您可以使用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将能够检测卡内的值是否发生变化并仅保存修改后的项目。
如果你能做到(静态模式),这显然是做到这一点的好方法。
答案 1 :(得分:0)
如果您只想根据cardIndex更新卡片:
User.update({_id: userID}, {'$set': {
'cards.cardIndex': cardInfo
}}, function(err) {
//code
}
答案 2 :(得分:0)
感谢所有答案。 我另外找到了这个解决方案。
doc["cards"].set(cardIndex, cardInfo)
干杯!