Node.js Mongoose阵列更新不工作
我收藏了以下文件:Node.js Mongoose阵列更新不工作,node.js,mongodb,mongoose,Node.js,Mongodb,Mongoose,我收藏了以下文件: { "_id": { "$oid": "58e47622968feb182c4a26b5" }, "pollOptions": [ { "vote": 0, "option": "blue" }, { "vote": 0, "option": "green" },
{
"_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数组
下面是我所做的(两种不同的方法)。我有正确的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(在我的action creator中),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是一个对象。奇怪。这可能是更新不起作用的原因
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"
}
]
如果
req.params.userId
是ObjectId
类型,则查询将无法工作,因为user.username
是String
('mike'
在示例中)typeof(userId)的控制台日志告诉我userId是字符串。是的,当然,我的错,当我说ObjectId
时,我指的是24个字符的字符串,类似于5768323d7297115c1606f6ad
您可以尝试let query={'user.username':userId'pollttitle':pollttitle'pollpoptions.option':blue};让update={$inc:{'pollpoptions.$.vote':1};myModel.findOneAndUpdate(查询,更新,(err,doc)=>{res.send(doc);})下面的代码>为用户选择的选项增加投票数的查询。@Veeram:我尝试了你的建议。这不起作用:(对不起,我看不出你在这里修改了什么。我没有在这里修改,我只是在这里给出解决方案。