Обновить запрос, добавив ObjectID в массив дважды - PullRequest
0 голосов
/ 15 мая 2018

Я работаю над приложением для планирования таблиц, где гости могут быть назначены на столы.Модель таблицы имеет следующую схему:

const mongoose = require('mongoose');

mongoose.Promise = global.Promise;

const tableSchema = new mongoose.Schema({
  name: {
    type: String,
    required: 'Please provide the name of the table',
    trim: true,
  },
  capacity: {
    type: Number,
    required: 'Please provide the capacity of the table',
  },
  guests: [{
    type: mongoose.Schema.Types.ObjectId,
    ref: 'Guest',
  }],
});

module.exports = mongoose.model('Table', tableSchema);

Гостей можно перетаскивать в приложении (используя React DND) для «таблицы» компонентов React.После отбрасывания на таблицу POST-запрос Axios делается для метода Node.js, чтобы обновить базу данных и добавить идентификатор объекта гостя в массив в модели таблицы:

exports.updateTableGuests = async (req, res) => {
  console.log(req.body.guestId);
  await Table.findOneAndUpdate(
    { name: req.body.tablename },
    { $push: { guests: req.body.guestId } },
    { safe: true, upsert: true },
    (err) => {
      if (err) {
        console.log(err);
      } else {
      // do stuff
      }
    },
  );
  res.send('back');
};

Это работает какожидается, за исключением того, что с каждым отброшенным гостем массив гостей модели таблицы обновляется с одинаковым гостевым идентификатором объекта дважды?Кто-нибудь знает, почему это будет?

Я попытался зарегистрировать req.body.guestID, чтобы убедиться, что это одно значение, а также чтобы убедиться, что эта функция не вызывается дважды.Но ни один из этих тестов не принес неожиданных результатов.Поэтому я подозреваю, что что-то не так с моим findOneAndUpdate запросом?

1 Ответ

0 голосов
/ 15 мая 2018

Не используйте здесь оператор $ push , вместо этого вам нужно использовать оператор $ addToSet ...

Оператор $ push может многократно обновлять массив с одним и тем же значением. где оператор $ addToSet добавляет значение в массив, если только значение уже присутствует.

exports.updateTableGuests = async (req, res) => {
  console.log(req.body.guestId);
  await Table.findOneAndUpdate(
    { name: req.body.tablename },
    { $addToSet : { guests: req.body.guestId } },
    { safe: true, upsert: true },
    (err) => {
      if (err) {
        console.log(err);
      } else {
      // do stuff
      }
    },
  );
  res.send('back');
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...