如何让MongoDB字段值随其他字段值动态变化?
嵌套任务状态同步需求与实现方案
修正后的数据结构
原数据存在语法错误,items字段应为数组(用于存储多个子任务),修正后结构如下:
{ "name": "Task A", "completed": false, "no_of_items": placeholder1, "no_completed_items": placeholder2, "items": [ { "name": "Task A1", "completed": false, "no_of_items": placeholder1, "no_completed_items": placeholder2, "items": placeholder3 }, { "name": "Task A2", "completed": false, "no_of_items": placeholder1, "no_completed_items": placeholder2, "items": placeholder3 } ] }
注:placeholder3代表多层嵌套的子任务结构
核心需求
placeholder1:当前任务items数组的元素总数(即子任务数量)placeholder2:当前任务items数组中completed为true的子任务数量- 当
no_completed_items等于no_of_items时,自动将当前任务的completed字段从false改为true;底层任务完成后,同步更新所有上层任务的完成状态
实现思路与代码示例
以JavaScript为例,通过递归函数处理多层嵌套的任务结构:
function updateTaskStatus(task) { // 处理无嵌套子任务的底层任务 if (!task.items || task.items.length === 0) { task.no_of_items = 0; task.no_completed_items = 0; return task.completed; } // 计算子任务总数(placeholder1) task.no_of_items = task.items.length; // 统计已完成的子任务数量(placeholder2) task.no_completed_items = task.items.reduce((count, item) => { // 递归更新子任务状态,返回子任务是否完成 const isItemDone = updateTaskStatus(item); return count + (isItemDone ? 1 : 0); }, 0); // 同步当前任务的完成状态 task.completed = task.no_completed_items === task.no_of_items; return task.completed; } // 使用示例 const taskTree = { "name": "Task A", "completed": false, "items": [ { "name": "Task A1", "completed": false, "items": [ { "name": "Task A1-1", "completed": true, "items": [] }, { "name": "Task A1-2", "completed": true, "items": [] } ] }, { "name": "Task A2", "completed": false, "items": [ { "name": "Task A2-1", "completed": true, "items": [] } ] } ] }; updateTaskStatus(taskTree); console.log(taskTree);
关键逻辑说明
- 递归遍历:从最底层任务开始向上处理,确保子任务状态先更新完成,再同步到上层
- 数量计算:直接通过
task.items.length获取子任务总数;用reduce递归统计已完成子任务数量 - 状态同步:对比完成数与总数,自动切换当前任务的
completed状态
内容的提问来源于stack exchange,提问作者iamlc
相关产品推荐
相关产品推荐

