MongoError выдает пустую ошибку $addToSet

Это должна быть довольно простая ошибка, но она уже давно меня сбивает с толку.

Вот моя схема:

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, чтобы один и тот же противник не учитывался дважды.

Я попытался распечатать объект objToUpdate перед вызовом findOneAndUpdate и увидел, что внутри есть значение.

{
  '$addToSet': { wins: 'Team Warrios', total: 'Team Warrios' },
  status: 'Processing'
}

На основе этого вопроса Я также проверил, что схема и поля, которые я пытаюсь добавить, совпадают.

Сослался на этот вопрос, но это не не полезно.

Любой вклад приветствуется.

Я использую Mongoose — 5.1.3 и NodeJS — 12.6.0.


person Sashi    schedule 06.07.2020    source источник
comment
opponent пусто?   -  person D. SM    schedule 06.07.2020
comment
Нет. Сначала я проверил это. Оппонент — это строка, которая присутствует, когда я печатаю objToUpdate непосредственно перед вызовом findOneAndUpdate.   -  person Sashi    schedule 07.07.2020
comment
Так что именно вы отправляете в базу данных?   -  person D. SM    schedule 07.07.2020
comment
Обновил мой вопрос с помощью объекта, который отправляется в базу данных. wins и total — это два массива, в которые я хочу добавить «Team Warrios». у противника есть строка «Team Warrios», которая корректно добавляется в $addToSet   -  person Sashi    schedule 07.07.2020


Ответы (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
 }
person Oshan Madusanka    schedule 07.07.2020
comment
Привет. Спасибо за Ваш ответ. Я отредактировал свой вопрос с правильной схемой. total имеет числовой тип, а не массив. Но и в вашем примере кода вы также включаете matchDetails.total+1 в 'total', который затем является частью $addToSet. Это не должно быть возможно, верно? - person Sashi; 07.07.2020
comment
Хорошо, я предположил, что total - это массив. Просто переместите total из addToSetParams в objToUpdate. Отредактировал ответ, чтобы отразить это. - person Oshan Madusanka; 07.07.2020
comment
Эй, спасибо за разъяснение. Но тотал всегда был внутри objToUpdate, а не внутри addToSet. Вы можете проверить мою историю редактирования. В последнем редактировании я сделал это немного более ясным, переместив скобки на следующую строку. - person Sashi; 07.07.2020