我第一次在这里问,但是我一直都在使用您的答案,所以谢谢您。
我的问题是下一个。我有一个名为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;
}
}
}
}
问题是我无法从任务编辑模式字段。我认为这是因为猫鼬查找返回的模型不允许这样做。然后我开始搜索,我认为最好的方法是进行一个复杂的更新查询,但是我不知道从哪里开始,所以就在那儿。
您看到的任何可以改进的地方,我都非常感激。