Mongoose 创建文档,然后使用客户端中的文档更新文档。不确定的最佳做法

Mongoose 创建文档,然后使用客户端中的文档更新文档。不确定的最佳做法,mongoose,Mongoose,我的目标是: 1.创建一个文档-我需要确保文档是有效的,并实际保存到数据库中,因为它的_id可能嵌入同一集合中的其他文档。 2.保存后,我需要针对集合中的所有其他文档运行此文档,以查找哪些文档id嵌入到其自身中。 3.然后我想更新此文档并保存它 我已经查阅了几个小时的文件了 我知道当我编辑保存或获取的文档时,mongoose会看到更改并触发updateOne() Mongoose文档跟踪更改。您可以使用普通JavaScript分配修改文档,Mongoose将其转换为MongoDB更新操作符。 问

我的目标是: 1.创建一个文档-我需要确保文档是有效的,并实际保存到数据库中,因为它的_id可能嵌入同一集合中的其他文档。 2.保存后,我需要针对集合中的所有其他文档运行此文档,以查找哪些文档id嵌入到其自身中。 3.然后我想更新此文档并保存它

我已经查阅了几个小时的文件了

我知道当我编辑保存或获取的文档时,mongoose会看到更改并触发updateOne()
Mongoose文档跟踪更改。您可以使用普通JavaScript分配修改文档,Mongoose将其转换为MongoDB更新操作符。

问题1是对象上的updateOne()触发是异步的,如果我运行批量文档创建,就会收到VersionError警告。有没有办法让它异步/等待

另一个选项是手动运行updateOne()。但是文档声明save()是更新的正确方式。我找不到这方面的最佳实践。
save()函数通常是使用Mongoose更新文档的正确方法。使用save(),您可以获得完整的验证和中间件。

在编辑文档时,如何在不触发标准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 })
错误

{VersionError:找不到id为“5cfef0ad6037ee55f17d4ee5”版本0修改路径“协同、反同步”的匹配文档
位于VersionError.MongooseError[作为构造函数](/Applications/XAMPP/xamppfiles/htdocs/mlgserver/node_modules/mongoose/lib/error/MongooseError.js:14:11)
新版本错误(/Applications/XAMPP/xamppfiles/htdocs/mlgserver/node_modules/mongoose/lib/error/version.js:18:17)
生成时出错(/Applications/XAMPP/xamppfiles/htdocs/mlgserver/node_modules/mongoose/lib/model.js:401:10)
在model.model.save(/Applications/XAMPP/xamppfiles/htdocs/mlgserver/node_modules/mongoose/lib/model.js:459:28)
at对象。(/Applications/XAMPP/xamppfiles/htdocs/mlgserver/dist/mongoose/spirespy/cards.js:416:39)
在Generator.next()处
完成时(/Applications/XAMPP/xamppfiles/htdocs/mlgserver/dist/mongoose/spirespy/cards.js:4:58)
在
在进程中。_tick回调(内部/process/next_tick.js:189:7)
消息:“未找到id为“5cfef0ad6037ee55f17d4ee5”版本0修改路径“协同、反协同”的匹配文档,
名称:'VersionError',
版本:0,
修改路径:[“协同”、“反协同”]}```

什么是
等待更新的卡片数据。协同效应
?当没有函数调用时,您如何等待此操作?
updatedCardData.synergies
是一个函数吗?它什么都不是。我想等待对文档进行更改时触发的此钩子(updateOne())。什么是
等待updatedCardData.synergies
?当没有函数调用时,您如何等待此操作?
updatedCardData.synergies
是一个函数吗?它什么都不是。我想等待对文档进行更改时触发的这个钩子(updateOne())。
{ 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' ] }```