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

J'ai du mal à utiliser Mongoskin pour effectuer une insertion en masse (MongoDB 2.6+) sur Node.

var dbURI = urigoeshere; var db = mongo.db(dbURI, {safe:true}); var bulk = db.collection('collection').initializeUnorderedBulkOp(); for (var i = 0; i < 200000; i++) { bulk.insert({number: i}, function() { console.log('bulk inserting: ', i); }); } bulk.execute(function(err, result) { res.json('send response statement'); }); 

Le code ci-dessus donne les avertissements / erreurs suivants:

 (node) warning: possible EventEmitter memory leak detected. 51 listeners added. Use emitter.setMaxListeners() to increase limit. TypeError: Object #<SkinClass> has no method 'execute' (node) warning: possible EventEmitter memory leak detected. 51 listeners added. Use emitter.setMaxListeners() to increase limit. TypeError: Object #<SkinClass> has no method 'execute' 

Est-il possible d'utiliser Mongoskin pour effectuer des opérations en vrac non ordonnées? Si oui, qu'est ce que je fais mal?

Vous pouvez le faire, mais vous devez modifier vos conventions d'appel pour le faire car seul le formulaire "rappel" renverra un objet de collection à partir duquel la méthode .initializeUnorderedBulkOp() peut être appelée. Il existe également des différences d'utilisation sur 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 }); }); 

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

Alors que le conducteur va régler ce problème pour vous un peu, ce n'est probablement pas une excellente idée de mettre en colloque trop d'opérations avant d'exécuter l'appel. Cela se construit fondamentalement dans la mémoire, et bien que le pilote n'envoie que des lots de 1000 à la fois (c'est une limite de serveur ainsi que le lot complet de moins de 16 Mo), vous voulez probablement un peu plus de contrôle ici, du moins à Limite l'utilisation de la mémoire.

C'est le point des tests de modulo comme montré, mais si la mémoire pour construire les opérations et un objet de réponse peut-être très important ne vous pose aucun problème, vous pouvez simplement continuer à faire des opérations de files d'attente et appeler .execute() une fois.

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