Как сделать сложный запрос на обновление в мангусте - PullRequest
0 голосов
/ 14 февраля 2020

я впервые спрашиваю здесь, но я все время использую ваш ответ, так что спасибо вам за это.

Моя проблема следующая. У меня есть схема goose mon с именем 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:[]},
}]

Это будет конечная цель. Что я делаю, это, во-первых, создаю новости. Затем я выполняю запрос на поиск, чтобы найти все задачи, выполнить al oop над ними, найти их parent и childs и сохранить их обоих (parent с информацией о потомках и child с информацией о родителях). Я делаю это с помощью следующей функции:

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;
                }
            }
        }
}

Проблема в том, что я не могу отредактировать поле шаблона из задачи. Я думаю, это потому, что mon goose find возвращает модель, которая этого не допускает. Затем я начал искать, и я думаю, что лучшим подходом было бы сделать сложный запрос на обновление, но я не знаю, с чего начать, поэтому я нахожусь.

Все, что вы видите, может быть улучшено Я был бы рад услышать.

...