Создайте документ, затем обновите документ, используя документ в клиенте. Не уверены, лучшая практика - PullRequest
1 голос
/ 11 июня 2019

Моя цель: 1. Создайте документ - мне нужно убедиться, что документ действителен и фактически сохраняется в базе данных, поскольку его _id потенциально встроен в другие документы из той же коллекции. 2. После сохранения мне нужно запустить этот документ для всех других документов в коллекции, чтобы найти, какие документы _id встроены в себя. 3. Затем я хочу обновить этот документ и сохранить его.

Я часами осматриваю документы.

Я понимаю, что когда я редактирую сохраненный или извлеченный документ, Мангуст видит изменения и запускает updateOne () Mongoose documents track changes. You can modify a document using vanilla JavaScript assignments and Mongoose will convert it into MongoDB update operators.

Проблема 1 заключается в том, что updateOne () запускает объект асинхронно, и если я запускаю массовое создание документации, я получаю предупреждение VersionError. Есть ли способ сделать это async / await?

Другой вариант - запустить updateOne () вручную. НО в документации указано, что save () - это правильный способ обновления. Я не могу найти лучшую практику для этого. The save() function is generally the right way to update a document with Mongoose. With save(), you get full validation and middleware.

Как получить и отредактировать документ, не используя стандартную функцию updateOne () при редактировании документа?

Попытка 1

    // check if already exists
    const existsCheck = await getCard(null, card.name);
    if (existsCheck) {
      throw new Error(`Duplicate item, ${existsCheck.name} already exists: [${existsCheck.id}]`);
    }

    console.log(`Creating card ${card.name}`);
    const baseCard = new Card( card );

    baseCard.synergiespre = stringToArray(baseCard.synergiespre, ',');
    baseCard.antisynergiespre = stringToArray(baseCard.antisynergiespre, ',');
    // baseCard.markModified('synergiespre');
    // baseCard.markModified('antisynergiespre');
    // create card to:
    // 1. Get an id
    // 2. Ensure save() occurs before creating item synergies editing other item synergies
    await baseCard.save();

    const updatedCardData = await compileSynergiesAndAntiSynergies(baseCard);
    baseCard.synergies = await updatedCardData.synergies; // doesnt await
    baseCard.antisynergies = await updatedCardData.antisynergies; // doesnt await

    const returnPopulatedCard = await getCard(baseCard.id);
    console.log('Populated Return');
    console.log(returnPopulatedCard);

    return returnPopulatedCard;

Без ожидания я получаю VersionError, так как есть много асинхронных изменений

Попытка 2

    // check if already exists
    const existsCheck = await getCard(null, card.name);
    if (existsCheck) {
      throw new Error(`Duplicate item, ${existsCheck.name} already exists: [${existsCheck.id}]`);
    }

    console.log(`Creating card ${card.name}`);
    let baseCard = new Card( card );

    baseCard.synergiespre = stringToArray(baseCard.synergiespre, ',');
    baseCard.antisynergiespre = stringToArray(baseCard.antisynergiespre, ',');
    // baseCard.markModified('synergiespre');
    // baseCard.markModified('antisynergiespre');
    // create card to:
    // 1. Get an id
    // 2. Ensure save() occurs before creating item synergies and editing other item synergies
    baseCard = await baseCard.save();

    const updatedCardData = await compileSynergiesAndAntiSynergies(baseCard);
    baseCard.synergies = await updatedCardData.synergies;
    baseCard.antisynergies = await updatedCardData.antisynergies;
    baseCard = await baseCard.save();

    const returnPopulatedCard = await getCard(baseCard.id);
    console.log('Populated Return');
    console.log(returnPopulatedCard);

    return returnPopulatedCard;

VersionError, как я пытаюсь сохранить (), как рекомендуется Как мне получить документ и отредактировать, а затем сохранить () без запуска updateOne ()

Журнал отладки

Mongoose: 
  cards.updateOne(
    { _id: ObjectId("5cfef0ad6037ee55f17d4ee5"), __v: 0 },
    { '$set': {
      antisynergies: [ ObjectId("5cfeea1840b4cc558e14a221") ], 
      synergies: [ 
        ObjectId("5cfeea0e40b4cc558e149e90"),
        ObjectId("5cfeea1040b4cc558e149ed6"),
        ObjectId("5cfeea1040b4cc558e149ee1"), 
        ObjectId("5cfeea1440b4cc558e14a07f"), 
        ObjectId("5cfeea1540b4cc558e14a0bc"), 
        ObjectId("5cfeea1540b4cc558e14a0cf"), 
        ObjectId("5cfef0ad6037ee55f17d4ee5") ],
      updatedAt: new Date("Tue, 11 Jun 2019 00:07:10 GMT") },
      '$inc': { __v: 1 } }, { session: null })

ERROR

{ VersionError: No matching document found for id "5cfef0ad6037ee55f17d4ee5" version 0 modifiedPaths "synergies, antisynergies"
    at VersionError.MongooseError [as constructor] (/Applications/XAMPP/xamppfiles/htdocs/mlgserver/node_modules/mongoose/lib/error/mongooseError.js:14:11)
    at new VersionError (/Applications/XAMPP/xamppfiles/htdocs/mlgserver/node_modules/mongoose/lib/error/version.js:18:17)
    at generateVersionError (/Applications/XAMPP/xamppfiles/htdocs/mlgserver/node_modules/mongoose/lib/model.js:401:10)
    at model.Model.save (/Applications/XAMPP/xamppfiles/htdocs/mlgserver/node_modules/mongoose/lib/model.js:459:28)
    at Object.<anonymous> (/Applications/XAMPP/xamppfiles/htdocs/mlgserver/dist/mongoose/spirespy/cards.js:416:39)
    at Generator.next (<anonymous>)
    at fulfilled (/Applications/XAMPP/xamppfiles/htdocs/mlgserver/dist/mongoose/spirespy/cards.js:4:58)
    at <anonymous>
    at process._tickCallback (internal/process/next_tick.js:189:7)
  message: 'No matching document found for id "5cfef0ad6037ee55f17d4ee5" version 0 modifiedPaths "synergies, antisynergies"',
  name: 'VersionError',
  version: 0,
  modifiedPaths: [ 'synergies', 'antisynergies' ] }```
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...