将对象推入MongoDB中的嵌套数组

xvw2m8pv  于 2023-01-12  发布在  Go
关注(0)|答案(1)|浏览(138)

我有一个令人头疼的问题想和你们大家分享。
这是个模型:

_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,
      });
    });
};

我试图用 *$push * 将一个对象推入 * subtasks * 数组,但是Postman抛出了一个错误。
你知道我哪里做错了吗?谢谢你的帮助。

  • 黄金分割率

但是,我能够使用以下查询成功地将对象推送到 * tasks * 数组中:

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,
      });
    });
};
o3imoua4

o3imoua41#

如文档中所述,无法对嵌套数组使用多个位置$
位置$运算符不能用于遍历多个数组的查询,如遍历嵌套在其他数组中的数组的查询,因为$占位符的替换是单个值
应使用位置过滤运算符$[<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类型。

相关问题