sql >> Database teknologi >  >> NoSQL >> MongoDB

Mongoose (mongodb) batchindlæg?

Model.create() vs Model.collection.insert():en hurtigere tilgang

Model.create() er en dårlig måde at lave indsatser på, hvis du har at gøre med en meget stor bulk. Det vil være meget langsomt . I så fald skal du bruge Model.collection.insert , som klarer sig meget bedre . Afhængigt af størrelsen af ​​massen, Model.create() vil endda gå ned! Forsøgt med en million dokumenter, uden held. Brug af Model.collection.insert det tog kun et par sekunder.

Model.collection.insert(docs, options, callback)
  • docs er rækken af ​​dokumenter, der skal indsættes;
  • options er et valgfrit konfigurationsobjekt - se dokumenterne
  • callback(err, docs) vil blive kaldt, når alle dokumenter er blevet gemt, eller der opstår en fejl. Hvad angår succes, er docs rækken af ​​vedvarende dokumenter.

Som Mongooses forfatter påpeger her, vil denne metode omgå alle valideringsprocedurer og få direkte adgang til Mongo-driveren. Det er en afvejning, du skal lave, da du håndterer en stor mængde data, ellers ville du slet ikke være i stand til at indsætte det i din database (husk, vi taler om hundredtusindvis af dokumenter her).

Et simpelt eksempel

var Potato = mongoose.model('Potato', PotatoSchema);

var potatoBag = [/* a humongous amount of potato objects */];

Potato.collection.insert(potatoBag, onInsert);

function onInsert(err, docs) {
    if (err) {
        // TODO: handle error
    } else {
        console.info('%d potatoes were successfully stored.', docs.length);
    }
}

Opdatering 2019-06-22 :selvom insert() kan stadig bruges fint, det er blevet forældet til fordel for insertMany() . Parametrene er nøjagtig de samme, så du kan bare bruge det som en drop-in erstatning, og alt skulle fungere fint (nå, returværdien er lidt anderledes, men du bruger den nok ikke alligevel).

Reference

  • Mongo-dokumentation
  • Aaron Heckman på Google Groups diskuterer masseindlæg


  1. rails + docker + sidekiq + Fejl ved forbindelse til Redis på 127.0.0.1:6379 (Errno::ECONNREFUSED)

  2. Sådan bruger du Redis fra Node.js

  3. Hvad kan gøres ved at bruge CKANs asynkrone baggrundsjob?

  4. Fjern indlejret dokument i en indlejret række dokumenter