【问题标题】:MongoError throws a '$addToSet' is empty errorMongoError 抛出 '$addToSet' is empty 错误
【发布时间】: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

标签: node.js mongodb mongoose


【解决方案1】:

$addToSet 仅用于向数组添加新元素。您正在更新 @addToSet 中的字符串字段和数组字段

let addToSetParams = {}

 if (win) {
  addToSetParams.wins = opponent;
 } else {
  addToSetParams.loses = opponent;
 }

 let objToUpdate = {
  'total': matchDetails.total + 1,
  'status': 'Processing',
  'results': opponent,
  '$addToSet': addToSetParams
 }

【讨论】:

  • 嗨。感谢您的回答。我已经用正确的模式编辑了我的问题。 total 是数字类型而不是数组。但是在您的示例代码中,您也将 matchDetails.total+1 包含到“total”中,然后它是 $addToSet 的一部分。这应该是不可能的吧?
  • 好的,我假设 total 是一个数组。只需将总计从 addToSetParams 移动到 objToUpdate。编辑答案以反映这一点。
  • 您好,感谢您的澄清。但 total 一直在 objToUpdate 内部,而不是在 addToSet 内部。你可以查看我的编辑历史。在上一次编辑中,我通过将括号移到下一行使其更加清晰。
猜你喜欢
  • 2023-01-30
  • 1970-01-01
  • 2015-09-16
  • 2021-09-09
  • 1970-01-01
  • 2020-09-29
  • 2018-07-08
  • 2021-12-07
  • 1970-01-01
相关资源
最近更新 更多