Node.js 如何使用express js更新mongoose阵列?

Node.js 如何使用express js更新mongoose阵列?,node.js,mongodb,mongoose,Node.js,Mongodb,Mongoose,所以我有下面的文档,它类似于一个包含任务列表的板(比如todo列表) 如何更新和删除其中一张卡?(我没有任务架构,我想从董事会文档中删除该任务 我试过这个: router.put("/delete-task/:list/:task", auth, boardAuth, async (req, res) => { const listId = req.params.list; const task = req.params.task; const board

所以我有下面的文档,它类似于一个包含任务列表的板(比如todo列表)

如何更新和删除其中一张卡?(我没有任务架构,我想从董事会文档中删除该任务

我试过这个:

router.put("/delete-task/:list/:task", auth, boardAuth, async (req, res) => {
  const listId = req.params.list;
  const task = req.params.task;

  const board = await Board.findOne({ _id: req.board._id });
  if (!board) return res.status(404).send("no such board");

  Board.findOneAndUpdate(
    { _id: req.board._id },
    { $pull: { "boardLists.$[outer].cards": { _id: task } } },
    {
      arrayFilters: [{ "outer._id": listId }],
    }
  );
  res.send(board);
});

使用筛选的位置运算符,该运算符标识与更新匹配的数组元素

用于更新
阵列中的对象:

Board.findOneAndUpdate(
  { _id: "boardId" },
  { $set: { "boardLists.$[outer].cards.$[inner].text": "update value" } },
  {
    arrayFilters: [
      { "outer._id": "boardListId" },
      { "inner.text": "task two" },
    ]
  }
);
用于移除
卡中的对象
阵列使用


外部和内部是什么意思?如果我想按id过滤而不是text@Timo222它们只是阵列
董事会列表
卡片
中对象的位置标识符,即在这些阵列中引用哪个对象(还用于使用
阵列过滤器对哪个对象进行筛选
)它们也可以被命名为其他名称,如:
boardLists.$[i].cards.$[j].text
。为简单起见,我将它们命名为outer和inner。@Timo222,您也可以按id或任何其他属性进行筛选。@Timo222 If
task
at
{id:task}
listId
作为字符串传入,您可能希望将它们转换为
ObjectId
的实例。示例:
{u id:new mongoose.Types.ObjectId(task)}
new mongoose.Types.ObjectId(listId)
并尝试一下。
Board.findOneAndUpdate(
  { _id: "boardId" },
  { $set: { "boardLists.$[outer].cards.$[inner].text": "update value" } },
  {
    arrayFilters: [
      { "outer._id": "boardListId" },
      { "inner.text": "task two" },
    ]
  }
);
Board.findOneAndUpdate(
  { _id: "boardId" },
  { $pull: { "boardLists.$[outer].cards": { text: "task two" } } },
  {
    arrayFilters: [{ "outer._id": "boardListId" }],
  }
);