【问题标题】:How do I copy entries from one collection to another using mongoose?如何使用 mongoose 将条目从一个集合复制到另一个集合?
【发布时间】:2021-02-01 06:50:11
【问题描述】:

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

我已经想出了如何安排任务,我已经设置了我需要的表。代码前的一点解释——我计划这样做的方式是有两个不同的任务集合——一个我称之为“分配”的任务,将有需要复制的任务(包括它们的描述、状态和其他必要的data) 和另一个集合,我称之为“任务”,将具有完全相同的数据,但带有一个额外的“日期”字段。这是表格从中获取数据的地方,日期仅用于排序目的。

这是我目前所拥有的 -

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(),但我不确定它是否允许我插入我需要的字段,或者猫鼬是否支持它。我知道绝对有一种更简单的方法可以做到这一点,但我无法弄清楚。如果有人有任何意见和建议,我很乐意。

谢谢。

【问题讨论】:

    标签: node.js mongoose


    【解决方案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();
    }
    

    【讨论】:

    • 哦,哇,我觉得自己像个白痴 XD 感谢您为我指出这一点。但是有没有更简单的方法来做到这一点?出于某种原因,我觉得我无缘无故地采取了更长的方法。
    • 不是 100% 确定,但在我看来 nodeJS mongodb 驱动程序不支持copyTo,因为我在文档中找不到它:mongodb.github.io/node-mongodb-native/3.6/api。所以如果你想通过nodejs来做这个,我觉得没问题。
    • 请不要忘记接受这个答案,谢谢。如果您需要有关复制的更多帮助,请发布一个单独的问题。问题应该只关注一个特定的问题。
    猜你喜欢
    • 1970-01-01
    • 2023-03-13
    • 1970-01-01
    • 2015-10-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-28
    • 2017-02-08
    相关资源
    最近更新 更多