Node.js 如何使用express js更新mongoose阵列?
所以我有下面的文档,它类似于一个包含任务列表的板(比如todo列表) 如何更新和删除其中一张卡?(我没有任务架构,我想从董事会文档中删除该任务 我试过这个: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
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 Iftask
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" }],
}
);