Chaque requête utilisant JS peut réutiliser ou obtenir un tout nouveau contexte JS, sur lequel les objets JS stockés sont chargés. Pour faire ce que vous voulez, vous devez soit :
- mongod pour exécuter automatiquement le code stocké lors de son installation
- mapreduce pour avoir une méthode init
La première est certainement la fonctionnalité la plus intéressante. Il s'avère que la version 8 de mongodb le fait automatiquement (mais pas officiellement prise en charge), mais pas la version officielle de spidermonkey.
Dites que vous stockez un code comme :
db.system.js.save({ _id: "mylib", value: "myprint = function() { print('installed'); return 'installed';" }
Ensuite, dans la v8, vous pouvez utiliser myprint() librement dans votre code, mais avec SM, vous devrez appeler mylib() explicitement.
Pour contourner ce problème, vous pouvez créer une autre méthode :
db.system.js.save({ _id: "installLib", value: "if (!libLoaded) mylib(); libLoaded = true;" }
Et appelez-le depuis votre fonction map().
Ticket créé afin de standardiser les moteurs et de permettre l'exécution automatique :https://jira.mongodb.org /parcourir/SERVER-4450