2013-03-27 3 views
1

j'ai compris comment exécuter du code javascript sur le serveur MongoDB, d'un client Node.js:Effectuer non-bloquant eval lit dans MongoDB

db.eval("function(x){ return x*10; }", 1, function (err, retval) { 
    console.log('err: '+err); 
    console.log('retval: '+retval); 
}); 

Et cela fonctionne très bien. Mais les docs disent que db.eval() émet un verrou en écriture, de sorte que rien d'autre ne peut lire ou écrire dans la base de données. Je ne veux pas ça.

Il dit aussi que eval n'a pas une telle limitation, mais je ne sais pas où le trouver. De la façon dont ils en parlent, il semble que le eval normal soit uniquement disponible dans le shell mongo, et donc pas du côté client. Donc, comment puis-je exécuter ces procédures stockées sur le serveur mongodb sans tout bloquer?

Répondre

1

vous pouvez passer un objet avec le champ nolock défini sur true comme un 3ème paramètre optionnel à eval:

db.eval('function (x) {return x*10; }', [1], {nolock:true}, function(err, retval) { 
    console.log('err: '+err); 
    console.log('retval: '+retval); 
}); 

Notez que cela empêche eval de la fixation d'un verrouillage en écriture obligatoire, mais elle ne l'empêche pas toutes les opérations à l'intérieur de votre fonction de créer des verrous d'écriture sur leur propre.

Source: the documentation.

Notez que le terme "procédure stockée" est incorrect dans ce cas. Une procédure stockée fait référence au code qui est stocké sur la base de données elle-même et qui n'est pas fourni par la couche d'application. MongoDB peut également le faire en utilisant la collection spéciale db.system.js, mais cela est déconseillé: http://docs.mongodb.org/manual/applications/server-side-javascript/#storing-functions-server-side

Par ailleurs: MongoDB n'a pas été conçu pour les procédures stockées. Il est généralement recommandé d'implémenter toute logique avancée sur la couche d'application. La pratique consistant à implémenter des opérations même triviales en tant que procédures stockées, comme cela est parfois fait sur des bases de données SQL, est déconseillée.

0

C'est-ce le moyen de stocker vos fonctions sur le côté serveur et que vous appelez l'utiliser comme indiqué ci-dessous:

db.system.js.save( {  _id : "myAddFunction" , value : function (x,y) 
{ return x +y;} }); 

db.system.js.find() 

{ "_id" : "myAddFunction", "value" : function (x,y){ return x + y; } } 


db.eval("myAddFunction(1 ,2)") 
3 
+0

Vous devez indiquer que l'utilisation db.system.js est activement découragée. Extrait de la [documentation] (http://docs.mongodb.org/manual/applications/server-side-javascript/#storing-functions-server-side): "** Note: ** Nous ne ** pas * * recommande d'utiliser des fonctions stockées côté serveur si possible. " – Philipp