更新查询两次将 ObjectID 添加到数组

Jam*_*ell 4 mongoose mongodb mongodb-query

我正在开发一个桌子规划器应用程序,可以将客人分配到桌子上。表模型具有以下架构:

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);
Run Code Online (Sandbox Code Playgroud)

客人可以在应用程序中(使用 React DND)拖放到“表”React 组件。当被放到一个表上时,一个 Axios POST 请求被发送到一个 Node.js 方法来更新数据库并将来宾的对象 ID 添加到表模型中的一个数组中:

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');
};
Run Code Online (Sandbox Code Playgroud)

这是按预期工作的,除了每个删除的来宾,表模型的来宾数组都使用相同的来宾对象 ID 更新两次?有谁知道为什么会这样?

我已经尝试记录req.body.guestID以确保它是一个单一的值,并检查这个函数没有被调用两次。但这些测试都没有带来意想不到的结果。因此,我怀疑我的findOneAndUpdate查询有问题?

Ash*_*shh 6

不要在这里使用$push运算符,您需要使用$addToSet运算符代替...

$推操作者能够更新具有相同的值多次阵列,其中作为$ 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');
};
Run Code Online (Sandbox Code Playgroud)