【问题标题】:findOneandReplace keeps giving error: "Error: The replacement document must not contain atomic operators."?findOneandReplace 一直报错:“错误:替换文档不能包含原子操作符。”?
【发布时间】:2021-05-03 23:29:31
【问题描述】:

我目前正在开发一个 Pokemon Team Builder 应用程序,该应用程序带有一个 React 前端和一个 Express 后端,带有用于数据库的 MongoDB。

据我所知,我的 TeamSchema 没有这样的原子运算符?这是我的 TeamSchema:

const mongoose = require('mongoose');

const TeamSchema = new mongoose.Schema({
  name: {
    type: 'String',
    required: true,
    unique: true,
  },
  team: [
    {
      name: { type: String },
      types: [{ type: String }],
      sprite: { type: String },
    },
  ],
  username: {
    type: String,
    required: true,
  },
  userId: {
    type: String,
    required: true,
  },
});

const TeamModel = mongoose.model('Team', TeamSchema);

module.exports = TeamModel;

当我尝试通过查找名称和 userId 匹配的团队来调用 findOneAndReplace 方法时,此方法中会引发错误。

const replaceTeam = async (req, res) => {
  const { teamName: name, filteredTeam: team } = req.body;
  const { username, _id: userId } = req.user;
  const newTeam = new Team({ name, team, username, userId });

  try {
    const replacedTeam = await Team.findOneAndReplace({ name, userId }, newTeam);
    console.log(replacedTeam);
    res.status(200).json({ message: 'Team was successfully overwritten!' });
  } catch (err) {
    console.log(err);
    res.status(500).json({ message: 'An error occurred while updating the team.' });
  }
};

这真是令人头疼,我不确定这里出了什么问题。我几周前才开始使用猫鼬,所以我想知道这是否是我在这里误解的基本问题。

【问题讨论】:

  • 您是否尝试过对传入newTeam 的数据执行console.log 以确保数据正确,并确认newTeam 确实包含有效模型?
  • 是的,这对我来说确实有效,这是 newTeam 为我输出的内容:pastebin.com/BQBj2q1T。话虽如此,它看起来确实像 Team 对象中的 Pokemon 对象本身被赋予了 _id,尽管我从未明确设置过这些。那是原子运算符的来源吗?如果是这样,我能做些什么来规避这种情况并能够成功替换文档?
  • 我很确定这就是它在谈论原子运算符时所指的内容。 Team 是否在 const newTeam = new Team 行中导入了 MongooseJS TeamModel?
  • 是在文件顶部:const Team = require('../models/Team');
  • findOneAndReplace 期望的是文档对象,而不是模型。一旦您调用const newTeam = new Team,newTeam 现在就是一个模型,并且已经在数据库中创建。将newTeam 创建为具有必填字段的对象,而不是使用new Team,看看是否可行。

标签: javascript node.js mongodb mongoose


【解决方案1】:

Mongoose 函数 findOneAndReplace 需要传入一个文档对象。请参见下面的代码。

details.findOneAndReplace(
  { location: "New York" },
  { name: "Sunny", age: 292, location: "Detroit" },
  function(err, result) {
    if (err) {
      res.send(err);
    } else {
      res.send(result);
    }
  }
);

改变

const newTeam = new Team({ name, team, username, userId })

到

const newTeam = {name, team, username, userId}

与其他发帖人的代码一样,通过更改将new: true 选项添加到调用中,如下所示

const replacedTeam = await Team.findOneAndReplace({ name, userId }, newTeam);

到

const replacedTeam = await Team.findOneAndReplace({ name, userId }, newTeam, { new: true });

否则原文档会被退回到replacedTeam

【讨论】:

    【解决方案2】:

    您可以使用findOneAndUpdate 并使用新数据更新所有字段。你可以这样做:

    const replaceTeam = async (req, res) => {
      const { teamName: name, filteredTeam: team } = req.body;
      const { username, _id: userId } = req.user;
      try {
        const replacedTeam = await Team.findOneAndUpdate({ name, userId }, { name, team, username, userId }, {new: true});
        console.log(replacedTeam);
        res.status(200).json({ message: 'Team was successfully overwritten!' });
      } catch (err) {
        console.log(err);
        res.status(500).json({ message: 'An error occurred while updating the team.' });
      }
    };
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-03-16
      • 2016-12-17
      • 2019-04-17
      • 1970-01-01
      • 1970-01-01
      • 2018-01-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多