如何在猫鼬中进行复杂的更新查询

时间:2020-02-14 11:03:49

标签: mongoose model save schema ref

我第一次在这里问,但是我一直都在使用您的答案,所以谢谢您。

我的问题是下一个。我有一个名为Tasks的猫鼬模式,它像这样:

var task = new Schema({
    code: {type: String}
    parent : { type: Schema.Types.ObjectId, ref: 'Task'},
    childrens: [{type: Schema.Types.ObjectId, ref: 'Task'}] 
})

任务是从excel文档中读取的,并且仅包含“代码”信息。这样,我必须填写父级和子级字段。 一个例子是:

//Array of taks from excel
[{
  {_id:1, code : '01'},
  {_id:2, code: '01.01'},
  {_id:3, code: '01.02'},
  {_id:4, code: '01.02.01'},
}]

最后,最终数组应为:

//Array of taks from excel
[{
  {_id:1, code : '01', childrens:[2,3]},
  {_id:2, code: '01.01', parent: 1, childrens:[]},
  {_id:3, code: '01.02', parent: 1, childrens:[4]},
  {_id:4, code: '01.02.01', parent: 3, childrens:[]},
}]

那将是最终目标。我要做的是,首先,创建新闻专栏。然后,我执行一个查找查询以查找所有任务,对它们进行循环,并找到其父项和子项,然后将其保存(父项与子项信息一起,子项与父项信息一起保存)。我用下一个功能来做到这一点:

private async groupTasks() {
        let err, tasks = await Task.find(//query);

        var splitByLastDot = function (text) {
            var index = text.lastIndexOf('.');

            if (index !== -1) return text.slice(0, index);
            else return null;
        }
        for (let i = 0; i < tasks.length; i++) {
            let task= tasks[i];
            const parentCode = splitByLastDot(tarea.codigo)
            if (parentCode) {
                const parent = tasks.find(x => x.code=== parentCode);
                if (parent) {                        
                    task.parent = parent._id; //HERE IS THE PROBLEM
                    await task.save()
                    if (!parent.childrens.includes(task._id)) parent.childrens.push(task._id);
                    await parent.save()
                    break;
                }
            }
        }
}

问题是我无法从任务编辑模式字段。我认为这是因为猫鼬查找返回的模型不允许这样做。然后我开始搜索,我认为最好的方法是进行一个复杂的更新查询,但是我不知道从哪里开始,所以就在那儿。

您看到的任何可以改进的地方,我都非常感激。

0 个答案:

没有答案