我的收藏中有以下文件:
{
"_id": {
"$oid": "58e47622968feb182c4a26b5"
},
"pollOptions": [
{
"vote": 0,
"option": "blue"
},
{
"vote": 0,
"option": "green"
},
{
"vote": 0,
"option": "red"
}
],
"polltitle": "what is your favorite color?",
"user": {
"username": "mike",
"email": "mike@email.com",
"password": "abc",
"passwordconf": "abc"
},
"__v": 0
}
我想根据用户的选择更新投票号。我只能更新投票号码(无法让它工作),所以我试图更新整个pollOptions数组。
以下是我所做的(2种不同的方法)。我有pollData数组,有3个对象,如上面的文档中所示。查询返回正确的对象,如上面的文档中所示。但是,这不会更新数据库中的pollOptions数组。不明白为什么这不起作用。
app.post('/api/poll/:userId/:polltitle/:vote', (req, res) => {
let pollData = req.body;
let userId = req.params.userId;
let polltitle = req.params.polltitle;
let query = { 'user.username': userId, 'polltitle': polltitle };
myModel.findOne(query, (err, doc) => {
doc.pollOptions = pollData;
doc.save();
});
})
以下情况也不起作用。
app.post('/api/poll/:userId/:polltitle/:vote', (req, res) => {
let pollData = req.body;
let userId = req.params.userId;
let polltitle = req.params.polltitle;
let query = { 'user.username': userId, 'polltitle': polltitle };
let update = { $set: { 'pollOptions': pollData } };
myModel.findOneAndUpdate(query, update, (err, doc) => {
res.send(doc);
});
});
提前感谢您的帮助!
编辑:我相信我的查询工作正常。我可以在数据库中查询另一个文档,在URL中使用不同的polltitle参数,它将返回正确的文档对象。
我可以添加一个upvote(在我的动作创建者中),并且post请求的req.body
将显示带有upvote的pollOptions数组。但是,res对象显示pollOptions数组没有此upvote。我必须在这里找到具有findOneAndUpdate函数的update属性的东西。
编辑2 :pollData
的控制台日志向我显示pollData是一个数组。
[ { option: 'blue', vote: 1 }, { option: 'green', vote: 0 }, { option: 'red', vote: 0 } ]
但是,typeof(pollData)
的控制台日志告诉我pollData是一个对象。奇怪。这可能是更新无效的原因。
答案 0 :(得分:0)
app.post('/api/poll/:userId/:polltitle/:vote', (req, res) => {
let pollData = req.body;
let userId = req.params.userId;
let polltitle = req.params.polltitle;
let query = { 'user.username': userId, 'polltitle': polltitle };
let update = { $set: { 'pollOptions': pollData } };
myModel.findOneAndUpdate(query, update, (err, doc) => {
res.send(doc);
});
});
更新后:
"pollOptions" : [
{
"vote" : 1.0,
"option" : "blue"
},
{
"vote" : 0.0,
"option" : "green"
},
{
"vote" : 0.0,
"option" : "red"
}
]