使用 Mongoose 更新子文档
Updating a subdocument with Mongoose
我正在使用 angular、express 和 mongoose 构建一个简单的投票应用程序。
我的数据是这样的:`
var mongoose = require('mongoose');
var responseSchema = new mongoose.Schema({
responseText: String,
votes: {
type: Number,
default: 0
}
})
module.exports = mongoose.model('Responses', responseSchema);
var pollsSchema = new mongoose.Schema({
question: String,
responses: [responseSchema]
})
module.exports = mongoose.model('Polls', pollsSchema);`
所以,我有一个包含子文档响应模型的投票模型。
当有人投票时,我想增加回复的票数。
这是我正在处理的查询,但它不正确。
router.post('/api/polls/:id/vote', function (req, res, next) {
console.log("Poll ID : " + req.params.id);
console.log("Option ID : " + req.body._id);
Polls.findOneAndUpdate({
_id: req.params.id
}, {
$inc: {
'responses.id(req.body.id).votes': 1
}
}, function (err, post) {
if (err) return next(err);
console.log(err);
console.log(post);
console.log(post.responses.id(req.body._id).votes);
});
})
编辑:已更新
基本上,我在请求参数中发送轮询 ID,在响应正文中发送响应 ID。我可以 console.log 投票值,但我不知道如何编写查询。有人可以帮忙吗?
谢谢!
您可以使用 $inc
运算符。参见 documentation。
Polls.findOneAndUpdate({
_id: req.params.id,
responses._id: req.body._id
}, {
{$inc: {'responses.$.votes': 1}}
});
找到解决办法:基本上就是用findOne缩小id,然后在回调中进行查询。看起来有点奇怪,但它确实有效。如果其他人有更好的方法,我很乐意听到。谢谢!
router.post('/api/polls/:id/vote', function (req, res, next) {
Polls.findOne({
_id: req.params.id
}, 'responses', function (err, post) {
post.responses.id(req.body._id).votes++;
post.save();
})
})
我正在使用 angular、express 和 mongoose 构建一个简单的投票应用程序。
我的数据是这样的:`
var mongoose = require('mongoose');
var responseSchema = new mongoose.Schema({
responseText: String,
votes: {
type: Number,
default: 0
}
})
module.exports = mongoose.model('Responses', responseSchema);
var pollsSchema = new mongoose.Schema({
question: String,
responses: [responseSchema]
})
module.exports = mongoose.model('Polls', pollsSchema);`
所以,我有一个包含子文档响应模型的投票模型。
当有人投票时,我想增加回复的票数。 这是我正在处理的查询,但它不正确。
router.post('/api/polls/:id/vote', function (req, res, next) {
console.log("Poll ID : " + req.params.id);
console.log("Option ID : " + req.body._id);
Polls.findOneAndUpdate({
_id: req.params.id
}, {
$inc: {
'responses.id(req.body.id).votes': 1
}
}, function (err, post) {
if (err) return next(err);
console.log(err);
console.log(post);
console.log(post.responses.id(req.body._id).votes);
});
})
编辑:已更新
基本上,我在请求参数中发送轮询 ID,在响应正文中发送响应 ID。我可以 console.log 投票值,但我不知道如何编写查询。有人可以帮忙吗?
谢谢!
您可以使用 $inc
运算符。参见 documentation。
Polls.findOneAndUpdate({
_id: req.params.id,
responses._id: req.body._id
}, {
{$inc: {'responses.$.votes': 1}}
});
找到解决办法:基本上就是用findOne缩小id,然后在回调中进行查询。看起来有点奇怪,但它确实有效。如果其他人有更好的方法,我很乐意听到。谢谢!
router.post('/api/polls/:id/vote', function (req, res, next) {
Polls.findOne({
_id: req.params.id
}, 'responses', function (err, post) {
post.responses.id(req.body._id).votes++;
post.save();
})
})