【问题标题】:Push an object into a nested array in MongoDB将对象推入 MongoDB 中的嵌套数组
【发布时间】:2023-01-12 08:14:32
【问题描述】:

我在这里有一个令人头疼的问题,我想与大家分享。

所以这是模型:

    _id: ObjectId()
    name: String,
    columns: [
      {
        name: String,
        _id: ObjectId()
        tasks: [
          {
            title: String,
            description: String,
            status: String,
            _id: ObjectId()
            subtasks: [
              {
                title: String,
                isCompleted: Boolean,
              },
            ],
          },
        ],
      },
    ],
  });

和查询:

exports.createSubtask = (req, res) => {
  if (!req.body) {
    res.status(400).send({ message: "Task name can not be empty!" });
    return;
  }

  const board = req.params.board;
  const column = req.params.column;
  const task = req.params.task;

  Board.findOneAndUpdate(
    {
      _id: board,
      "columns._id": column,
      "columns.tasks._id": task,
    },
    {
      $push: {
        "columns.$.tasks.$.subtasks": req.body,
      },
    }
  )
    .then((data) => {
      if (!data) {
        res.status(404).send({
          message: `Cannot update Task with id=${task}. Maybe task was not found!`,
        });
      } else res.send({ message: "Task was updated successfully." });
    })
    .catch((err) => {
      res.status(500).send({
        message: "Error updating Task with id=" + task,
      });
    });
};

我试图将一个物体推入子任务阵列与$推,但 Postman 抛出错误。

关于我做错了什么的任何想法?感谢帮助。

  • 黄金比例

但是,我能够成功地将一个对象推入任务具有以下查询的数组:

exports.createTask = (req, res) => {
  if (!req.body) {
    res.status(400).send({ message: "Task name can not be empty!" });
    return;
  }

  const board = req.params.board;
  const column = req.params.column;

  Board.findOneAndUpdate(
    {
      _id: board,
      "columns._id": column,
    },
    {
      $push: {
        "columns.$.tasks": req.body,
      },
    }
  )
    .then((data) => {
      if (!data) {
        res.status(404).send({
          message: `Cannot update Column with id=${column}. Maybe column was not found!`,
        });
      } else res.send({ message: "Column was updated successfully." });
    })
    .catch((err) => {
      res.status(500).send({
        message: "Error updating Column with id=" + column,
      });
    });
};

【问题讨论】:

    标签: mongodb mongoose


    【解决方案1】:

    正如 docs 中所述,嵌套数组不能使用多个位置 $

    位置 $ 运算符不能用于遍历多个数组的查询,例如遍历嵌套在其他数组中的数组的查询,因为 $ 占位符的替换是单个值

    你应该使用positional filtered operator $[<identifier>]

    Board.findOneAndUpdate(
        {
          _id: board,
          "columns._id": column,
          "columns.tasks._id": task,
        },
        {
          $push: {
            "columns.$.tasks.$[task].subtasks": req.body,
          },
        },
        {
          arrayFilters: [
            { "task._id": task }
          ]
        }
      )
    .then(...);
    

    注意:确保传入的task是ObjectId类型。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-06-14
      • 2019-03-28
      • 1970-01-01
      • 2021-02-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多