Перемещение поддокумента из одного массива в другой теперь вызывает ошибку в Mongoose 6

#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()?