如何使用猫鼬将条目从一个集合复制到另一个?

时间:2020-10-18 08:40:01

标签: node.js mongoose

我正在尝试为一个工作项目创建一个小的任务管理站点。这里的总体目标是,每个月的任务保持不变(它们的状态可以更新,什么都可以),并且每个新月的开始都需要重复这些任务,以便可以在表上显示和排序这些任务。< / p>

我已经弄清楚了如何安排任务,已经有了需要设置的表。在代码之前做一些解释-我打算这样做的方式是有两个不同的任务集合-一个我称为“任务”的东西,将具有需要重复的任务(及其描述,状态和其他必要条件)数据)和另一个集合(我称为“任务”)将具有完全相同的数据,但带有一个额外的“日期”字段。这是表格从中获取数据的地方,日期仅用于排序目的。

这是我到目前为止所拥有的-

Index.js:从数据库获取所有分配,并将对象发送到重复函数。

router.get('/test', async function(req, res, next) {
  let allTasks = await dbModule.getAllAssignments();
  let result = await dbModule.duplicateTasks(allTasks);
  res.json(result);
});

dbmodule.js:

    getAllAssignments: () => {
        allAssignments = Assignment.find({});
        return allAssignments;
    },
    duplicateTasks: (allTasksToAdd) => {
        try {
            for (let i = 0; i < allTasksToAdd.length; i++) {
                let newTask = new Task({
                    customername: allTasksToAdd.customername,
                    provname: allTasksToAdd.provname,
                    description: allTasksToAdd.description,
                    status: allTasksToAdd.status,
                    date: "07-2020"
                })
                newTask.save();
            }
            return "Done"
        } catch (error) {
            return "Error"
        }
    }

当我尝试并实际复制任务时出现问题。出于测试目的,这次我手动输入了日期,但最终只能插入日期-仅是日期,其余数据将被跳过。我听说过db.collection.copyTo(),但不确定是否允许我插入所需的字段,或者猫鼬是否支持该字段。我知道绝对有更简单的方法可以做到这一点,但我还不太清楚。如果有人的话,我很乐意提供一些意见和建议。

谢谢。

1 个答案:

答案 0 :(得分:1)

问题在于allTasksToAdd.customername(以及您尝试访问的其他字段)将为undefined。您需要访问当前索引下的字段:

let newTask = new Task({
    customername: allTasksToAdd[i].customername,
    provname: allTasksToAdd[i].provname,
    description: allTasksToAdd[i].description,
    status: allTasksToAdd[i].status,
    date: "07-2020"
})

请注意,您可以改为使用for .. of循环来简化此操作:

for (const task of allTasksToAdd) {
    const newTask = new Task({
        customername: task.customername,
        provname: task.provname,
        description: task.description,
        status: task.status,
        date: "07-2020"
    });
    newTask.save();
}