sql >> Databáze >  >> NoSQL >> MongoDB

Hromadné upsert v MongoDB pomocí mongoose

Konkrétně ne v "mongoose", nebo alespoň zatím ne v době psaní. Shell MongoDB od verze 2.6 ve skutečnosti používá „API pro hromadné operace“ „pod kapotou“, jako tomu bylo u všech obecných pomocných metod. Ve své implementaci se o to nejprve pokusí, a pokud je detekován server starší verze, dojde k „návratu“ ke starší implementaci.

Všechny metody mongoose "aktuálně" používají "starší" implementaci nebo odpověď na otázku zápisu a základní starší metody. Existuje však .collection přístupový objekt z jakéhokoli daného modelu mongoose, který v podstatě přistupuje k "objektu kolekce" ze základního "nativního ovladače uzlu", na kterém je mongoose implementován:

 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
        });

 });

Hlavním úlovkem je, že „metody mongoose“ si ve skutečnosti uvědomují, že spojení ve skutečnosti ještě nebylo vytvořeno, a „pořadí“, dokud to není dokončeno. Nativní ovladač, do kterého „kopete“, tento rozdíl nerozlišuje.

Takže si opravdu musíte být vědomi toho, že spojení je navázáno nějakým způsobem nebo formou. Ale můžete použít metody nativního ovladače, pokud budete opatrní v tom, co děláte.



  1. redis dump.rdb / ukládání malých souborů

  2. Proč se Travisu při nasazení do Heroku nepodaří připojit pomocí Redis cache_store?

  3. MongoDB Object.bsonSize()

  4. Mongodb:Nepodařilo se připojit k 127.0.0.1:27017, důvod:errno:10061