#node.js #arrays #mongoose #subdocument
#node.js #массивы #мангуст #вспомогательный документ
Вопрос:
Я только что обновил Mongoose с 5.5.5 до 6.0.12, и часть моего кода перестала работать. В моем менеджере спортивной лиги у меня есть модель под названием Лига, в которой есть список категорий (групп). У каждой группы есть список команд. Итак, Лига.группы[].команды[] Мне нужно иметь возможность перемещать одну команду в команды другой группы[]. Итак, вот мой код:
const League = require('./schemas/volley/League'); const league = new League(); const group1 = league.groups.create({name:"Group 1"}); // create group1 const group2 = league.groups.create({name:"Group 2"}); // create group2 league.groups.push(group1); // add both groups to the league's list of groups. league.groups.push(group2); const team = group1.teams.create({name:"The Team To Transfer"}); // create a team group1.teams.push(team); // add it to group1's teams team.remove(); // later, remove it from group1's teams[] try { group2.teams.push(team); // try to add it to group2's teams[] } catch (err){ console.log(err); }
Короче говоря, я создал «команду», добавил ее в список команд group1 (group1.teams.push). Затем мне нужно переместить эту команду, поэтому я удаляю ее и перемещаю в команды группы 2.
Раньше это прекрасно работало в Мангусте 5. Теперь в мангусте 6 я получаю следующую ошибку:
TypeError: Cannot read property '$path' of undefined at EmbeddedDocument.ArraySubdocument.$__pathRelativeToParent (C:MTCmtc_servernode_modulesmongooselibtypesArraySubdocument .js:145:29) at EmbeddedDocument.Subdocument.invalidate (C:MTCmtc_servernode_modulesmongooselibtypessubdocument.js:202:25) at $__applyDefaults (C:MTCmtc_servernode_modulesmongooselibdocument.js:528:17) at EmbeddedDocument.Document (C:MTCmtc_servernode_modulesmongooselibdocument.js:148:7) at EmbeddedDocument.Subdocument (C:MTCmtc_servernode_modulesmongooselibtypessubdocument.js:28:12) at EmbeddedDocument.ArraySubdocument [as constructor] (C:MTCmtc_servernode_modulesmongooselibtypesArraySubdocument.js:36: 15) at new EmbeddedDocument (C:MTCmtc_servernode_modulesmongooselibschemadocumentarray.js:115:17) at DocumentArrayPath.cast (C:MTCmtc_servernode_modulesmongooselibschemadocumentarray.js:446:26) at DocumentArrayPath.SchemaType.applySetters (C:MTCmtc_servernode_modulesmongooselibschematype.js:1135:12) at Proxy.push (C:MTCmtc_servernode_modulesmongooselibtypesarraymethodsindex.js:655:38) at Proxy.push (C:MTCmtc_servernode_modulesmongooselibtypesDocumentArraymethodsindex.js:183:35) at testPathError (C:MTCmtc_serverapp.js:286:18) at Timeout._onTimeout (C:MTCmtc_serverapp.js:241:9)
Я нашел решение этой проблемы, воссоздав команду из group2 следующим образом
const newTeam = group2.teams.create(team); // recreate the team with new parent group2.teams.push(newTeam); // add team to new parent
Проблема в том, что в моем коде много экземпляров, в которых я перемещаю вложенные документы между массивами одного и того же типа, и нет никакой гарантии, что я ничего не нарушу, воссоздавая вложенные документы повсюду. Есть ли простое решение, при котором мне не нужно воссоздавать вложенный документ? Я, кажется, понимаю, что у Мангуста 6 теперь есть свойство «родитель» для вложенных документов, которое плохо реагирует, если вы пытаетесь подтолкнуть ребенка к неправильному родителю. (Как бы вы отреагировали, если бы ваш сосед заставил вас усыновить их детей?) Возможно, есть способ установить родителя? Или способ сбросить родительскую ссылку после .remove()?