MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

Comment utiliser l'insertion en vrac non ordonnée avec Mongoskin ?

Vous pouvez le faire mais vous devez modifier vos conventions d'appel pour ce faire car seul le formulaire "rappel" renverra réellement un objet de collection à partir duquel le .initializeUnorderedBulkOp() méthode peut être appelée. Il existe également des différences d'utilisation dans la façon dont vous pensez que cela fonctionne :

var dbURI = urigoeshere;
var db = mongo.db(dbURI, {safe:true});
db.collection('collection',function(err,collection) {
    var bulk = collection.initializeUnorderedBulkOp();
    count = 0;

    for (var i = 0; i < 200000; i++) {
        bulk.insert({number: i});
        count++;

        if ( count % 1000 == 0 )
            bulk.execute(function(err,result) {
               // maybe do something with results
               bulk = collection.initializeUnorderedBulkOp(); // reset after execute
            });      

    });

    // If your loop was not a round divisor of 1000
    if ( count % 1000 != 0 )
        bulk.execute(function(err,result) {
          // maybe do something here
        });
});

Ainsi, les méthodes "Bulk" elles-mêmes ne nécessitent pas de rappels et fonctionnent exactement comme indiqué dans la documentation. L'exception est .execute() qui envoie réellement les instructions au serveur.

Bien que le pilote règle cela quelque peu pour vous, ce n'est probablement pas une bonne idée de mettre en file d'attente trop d'opérations avant d'appeler execute. Cela s'accumule essentiellement dans la mémoire, et bien que le pilote n'enverra que des lots de 1000 à la fois (il s'agit d'une limite de serveur ainsi que le lot complet étant inférieur à 16 Mo), vous voulez probablement un peu plus de contrôle ici, au moins pour limiter l'utilisation de la mémoire.

C'est le but des tests modulo comme indiqué, mais si la mémoire pour la construction des opérations et un objet de réponse éventuellement très volumineux ne vous posent pas de problème, vous pouvez simplement continuer à mettre les opérations en file d'attente et appeler .execute() une fois.

La "réponse" est dans le même format que celui indiqué dans la documentation de BulkWriteResult.