【发布时间】:2020-07-07 16:19:19
【问题描述】:
这应该是一个很简单的错误,但它让我困惑了很长时间。
这是我的架构:
const TeamSchema = new Schema({
status: {
type: String
},
total: {
type: Number,
default: 0,
},
wins: {
type: Array,
required: true,
default: [],
},
loses: {
type: Array,
required: true,
default: [],
});
我的代码:
let objToUpdate = {
'$addToSet': {
'results': opponent
},
'total': matchDetails.total + 1,
'status': 'Processing',
};
if (win) {
objToUpdate['$addToSet'].wins = opponent;
} else {
objToUpdate['$addToSet'].loses = opponent;
}
TeamStatistics.findOneAndUpdate({_id:teamId},objToUpdate,{new:true},function(err, result){
if(err){
console.log(err);
} else {
console.log(result)
});
我遇到了这个错误:
MongoError: '$addToSet' is empty. You must specify a field like so: {$addToSet: {<field>: ...}}
代码计算每支球队的统计数据,并将每场比赛的对手添加到胜利数组或失败数组中,具体取决于球队是赢了对手还是输了。无论结果如何,所有对手也都存储在总数组中。我需要使用 '$addToSet' 这样同一个对手就不会被计算两次。
我在调用 findOneAndUpdate 之前尝试打印出 'objToUpdate' 对象,我发现里面有一个值。
{
'$addToSet': { wins: 'Team Warrios', total: 'Team Warrios' },
status: 'Processing'
}
基于此question,我还验证了架构和我尝试添加的字段是否匹配。
也提到了这个question - 但它没有帮助。
非常感谢任何输入。
我正在使用 Mongoose - 5.1.3 和 NodeJS - 12.6.0
【问题讨论】:
-
opponent是空的吗? -
没有。我先检查了一下。 Opponent 是一个字符串,当我在调用 findOneAndUpdate 之前打印 objToUpdate 时出现
-
那么你到底要向数据库发送什么?
-
用发送到数据库的 obj 更新了我的问题。 wins 和 total 是我要添加“Team Warrios”的两个数组。对手的字符串“Team Warrios”被正确添加到 $addToSet