gpt4 book ai didi

node.js - mongodb使用更新来避免竞争条件,当字段为空数组时更新错误

转载 作者:太空宇宙 更新时间:2023-11-04 02:36:20 25 4
gpt4 key购买 nike

这是我的收藏:

var schema = new mongoose.Schema({
id: {type: Number, ref: 'id'},
member_id: Number,
title: String,
content: String,
pros: String,
cons: String,
createdAt: {type: Date, default: Date.now},
vote: [{
member_id:{type: Number,unique: true},
support: Boolean,
voted: Boolean,
createdAt: {type: Date, default: Date.now}
}],
comment: [{
member_id: Number,
support: Boolean,
content:String,
createdAt: {type: Date, default: Date.now}
}]
});

此数据库用于记录用户的投票。在服务器端,接收帖子累积投票:

Topic.update({"id":id,"vote.member_id":member_id},  
{$set:{ 'vote.$.member_id' : member_id, 'vote.$.support' : vote_to,'vote.$.voted' : true}} , { upsert: true }, function(err,test){
if (err) {
console.log(err);
return res.json({error: true});
}
else{
console.log(test);
res.json({msg:"success vote"});
}

但是在最初的情况下,换句话说,没有参与投票(投票是[]),它会收到错误消息:{ [MongoError: 如果没有包含数组的相应查询字段,则无法应用位置运算符。]
name: 'MongoError',
err: '如果没有包含数组的相应查询字段,则无法应用位置运算符。',
代码:16650,
数:0,
连接ID:133,
好的:1 }

如何解决这个问题?

最佳答案

根据文档,不建议在 mongoDB 中使用位置运算符 ($) 进行 upsert...

http://docs.mongodb.org/manual/reference/operator/update/positional/

Do not use the positional operator $ with upsert operations because inserts will use the $ as a field name in the inserted document.

因此,删除更新命令中的 upsert: true 并查看它是否有效。我建议您检查 update 回调中的更新计数,如果它为零,那么您可以使用 $push 发送另一个更新请求。在投票数组中。

关于node.js - mongodb使用更新来避免竞争条件,当字段为空数组时更新错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21970982/

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