sql >> Databasteknik >  >> NoSQL >> MongoDB

Bulk upsert i MongoDB med mongoose

Inte i "mongoose" specifikt, eller åtminstone inte ännu i skrivande stund. MongoDB-skalet från och med 2.6-versionen använder faktiskt "Bulk operations API" "under huven" så att säga för alla allmänna hjälpmetoder. I sin implementering försöker den att göra detta först, och om en äldre versionsserver upptäcks så finns det en "återgång" till den äldre implementeringen.

Alla mongoose-metoder använder "för närvarande" den "legacy" implementeringen eller skrivproblemsvaret och de grundläggande äldre metoderna. Men det finns en .collection accessor från en given mongoose-modell som i huvudsak kommer åt "samlingsobjektet" från den underliggande "nod-native drivrutinen" på vilken mongoose är implementerad själv:

 var mongoose = require('mongoose'),
     Schema = mongoose.Schema;

 mongoose.connect('mongodb://localhost/test');

 var sampleSchema  = new Schema({},{ "strict": false });

 var Sample = mongoose.model( "Sample", sampleSchema, "sample" );

 mongoose.connection.on("open", function(err,conn) { 

    var bulk = Sample.collection.initializeOrderedBulkOp();
    var counter = 0;

    // representing a long loop
    for ( var x = 0; x < 100000; x++ ) {

        bulk.find(/* some search */).upsert().updateOne(
            /* update conditions */
        });
        counter++;

        if ( counter % 1000 == 0 )
            bulk.execute(function(err,result) {             
                bulk = Sample.collection.initializeOrderedBulkOp();
            });
    }

    if ( counter % 1000 != 0 )
        bulk.execute(function(err,result) {
           // maybe do something with result
        });

 });

Den huvudsakliga haken där är att "mangometoder" faktiskt är medvetna om att en anslutning faktiskt inte kan göras ännu och "köar" tills detta är klart. Den inbyggda drivrutinen du "gräver i" gör inte denna skillnad.

Så du måste verkligen vara medveten om att kopplingen är etablerad på något sätt eller i någon form. Men du kan använda de inbyggda drivrutinsmetoderna så länge du är försiktig med vad du gör.



  1. Hur får man ett specifikt inbäddat dokument i en MongoDB-samling?

  2. Redis vs. Memcachad

  3. Python-redis keys() returnerar en lista med byteobjekt istället för strängar

  4. Docker mongo bild 'Anslutning nekad' från annan container