gpt4 book ai didi

javascript - Mongoose 嵌入式文档更新

转载 作者:IT老高 更新时间:2023-10-28 13:15:02 25 4
gpt4 key购买 nike

我遇到了嵌入式文档更新问题。

我定义的架构:

var Talk = new Schema({
title: {
type: String,
required: true
},
content: {
type: String,
required: true
},
date: {
type: Date,
required: true
},
comments: {
type: [Comments],
required: false
},
vote: {
type: [VoteOptions],
required: false
},
});

var VoteOptions = new Schema({
option: {
type: String,
required: true
},
count: {
type: Number,
required: false
}
});

现在我想用给定的 Talk id 和 VoteOption id 更新 vote.count++。我有以下功能来完成这项工作:

function makeVote(req, res) {

Talk.findOne(req.params.id, function(err, talk) {
for (var i = 0; i < talk.vote.length; i++) {
if (talk.vote[i]._id == req.body.vote) {
talk.vote[i].count++;

}
}
talk.save(function(err) {
if (err) {
req.flash('error', 'Error: ' + err);
res.send('false');
} else {
res.send('true');
}
});
});
}

一切都执行了,我取回了 res.send('true'),但是 count 的值没有改变。

当我做了一些 console.log 我看到它改变了值,但是 talk.save 只是没有将它保存在 db 中。

我也很不满意仅仅找到嵌入文档的 _id 的循环。在 Mongoose 文档中,我阅读了有关 talk.vote.id(my_id) 的信息,但这给了我没有 id 功能的错误。

最佳答案

当更新 Mixed 类型(这似乎不是基本类型,因此也包括嵌入文档)时,必须调用 .markModified文档。在这种情况下,它将是:

talk.markModified("vote"); // mention that `talk.vote` has been modified

talk.save(function(err) {
// ...
});

希望这对将来的某人有所帮助,因为我无法很快找到答案。


Reference:

... Mongoose loses the ability to auto detect/save those changes. To "tell" Mongoose that the value of a Mixed type has changed, call the .markModified(path) method of the document passing the path to the Mixed type you just changed.

关于javascript - Mongoose 嵌入式文档更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8002145/

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