sql >> Databasteknik >  >> NoSQL >> MongoDB

Mongoose duplicate key error med upsert

En upsert som resulterar i ett dokumentinlägg är inte en helt atomär operation. Tänk på upproret som att utföra följande diskreta steg:

  1. Fråga efter att det identifierade dokumentet ska läggas upp.
  2. Om dokumentet finns, uppdatera det befintliga dokumentet atomärt.
  3. Annars (dokumentet finns inte), infoga ett nytt dokument som innehåller frågefälten och uppdateringen.

Så steg 2 och 3 är vart och ett atomärt, men en annan upsert kan inträffa efter steg 1 så din kod måste leta efter dubblettnyckelfelet och sedan försöka om upsert om det inträffar. Då känner du till dokumentet med det _id finns så det kommer alltid att lyckas.

Till exempel:

var minute = utils.minute();
Monitor.update({ _id: minute }, { $inc: update }, { upsert: true }, function(err) {
    if (err) {
        if (err.code === 11000) {
            // Another upsert occurred during the upsert, try again. You could omit the
            // upsert option here if you don't ever delete docs while this is running.
            Monitor.update({ _id: minute }, { $inc: update }, { upsert: true },
                function(err) {
                    if (err) {
                        console.trace(err);
                    }
                });
        }
        else {
            console.trace(err);
        }
    }
});

Se här för relaterade dokumentation.

Du kanske fortfarande undrar varför detta kan hända om infogningen är atomär, men vad det betyder är att inga uppdateringar kommer att ske på det infogade dokumentet förrän det är helt skrivet, inte att ingen annan infogning av ett dokument med samma _id kan inträffa.

Du behöver inte heller skapa ett index manuellt på _id eftersom alla MongoDB-samlingar har ett unikt index på _id oavsett. Så du kan ta bort den här raden:

monitorSchema.index({_id: -1}); // Not needed



  1. phpMyAdmin motsvarande MySQL för Redis?

  2. Hur platta till ett underdokument till rotnivå i MongoDB?

  3. Vad är InputSplit i Hadoop MapReduce?

  4. MongoDB Ersätt specifika matrisvärden