Upserting von Dokumenten mit Mongoose

In MongoDB bedeutet ein Upsert eine Aktualisierung, die ein neues Dokument einfügt, wenn kein Dokument mit filter übereinstimmt . Um ein Dokument in Mongoose hochzuladen, sollten Sie den upsert setzen Option zum Model.updateOne() Funktion:

const res = await Character.updateOne(
  { name: 'Jean-Luc Picard' },
  { $set: { age: 59 } },
  { upsert: true } // Make this update into an upsert
);

// Will be 1 if MongoDB modified an existing document, or 0
// if MongoDB inserted a new document.
res.nModified;
// Contains an array of descriptions of the documents inserted,
// including the `_id` of all inserted docs.
res.upserted;

Um das eingefügte Dokument zu erhalten, sollten Sie den Model.findOneAndUpdate() verwenden Funktion anstelle von Model.updateOne() .

const doc = await Character.findOneAndUpdate(
  { name: 'Jean-Luc Picard' },
  { $set: { age: 59 } },
  { upsert: true, new: true }
);

doc.name; // 'Jean-Luc Picard'
doc.age; // 59

Mongoose fügt höchstens ein Dokument ein. Auch wenn Sie Model.updateMany() verwenden mit upsert , fügt Mongoose höchstens ein Dokument ein. Um mehrere Dokumente gleichzeitig hochzuladen, sollten Sie den Model.bulkWrite() verwenden Funktion.

const res = await Character.bulkWrite([
  {
    updateOne: {
      filter: { name: 'Will Riker' },
      update: { age: 29 },
      upsert: true
    }
  },
  {
    updateOne: {
      filter: { name: 'Geordi La Forge' },
      update: { age: 29 },
      upsert: true
    }
  }
]);

// Contains the number of documents that were inserted because
// of an upsert
res.upsertedCount;
// Contains the number of existing documents that were updated.
res.modifiedCount;
Möchten Sie der MongoDB-Experte Ihres Teams werden? „Mastering Mongoose“ fasst 8 Jahre hart erarbeitete Lektionen zum Erstellen von Mongoose-Apps in großem Maßstab auf 153 Seiten zusammen. Das bedeutet, dass Sie in wenigen Tagen lernen können, was Sie wissen müssen, um produktionsreife Full-Stack-Apps mit Node.js und MongoDB zu erstellen. Holen Sie sich Ihr Exemplar!