我正在尝试在我的nodejs / node-mongodb-native项目中使用MongoDB server-side JavaScript,并且只关心如何在MongoDB的全局上下文中保存自定义函数并从db.eval
访问它们脚本?
假设我有以下单位功能:
var myDocumentUtils = {
doStuff: function (doc) {
// do stuff with doc ...
return doc;
}
}
我在db.system.js
集合中存储了以下JavaScript函数:
function processDocument (id) {
var doc = db.myCollection.findOne({ _id : ObjectId(id)});
doc = myDocumentUtils.doStuff(doc); // need access to global myDocumentUtils object
db.myCollection.save(doc);
return doc;
};
我从nodejs应用程序执行processDocument
函数,如下所示:
db.eval('processDocument(54382cb3233283cd3331ca1d)', function (err, doc) {
if (err) throw err;
});
所以我的问题是如何在全局MongoDB V8上下文中保存myDocumentUtils
以便在db.eval函数中访问?
答案 0 :(得分:1)
将第二个参数添加到processDocument
,如下所示:
function processDocument (id, myDocumentUtils) {
var doc = db.myCollection.findOne({ _id : ObjectId(id)});
doc = myDocumentUtils.doStuff(doc); // need access to global myDocumentUtils object
db.myCollection.save(doc);
return doc;
};
然后像这样写db.eval()
:
db.eval(function() {
return processDocument.apply(this, arguments);
}, "54382cb3233283cd3331ca1d", myDocumentUtils);
对于您的环境,您可以在最后一个参数 myDocumentUtils 后面添加回调。
APPEND ---------------------
将两个函数存储到db.system.js
:
function getMyDocumentUtils() {
return myDocumentUtils = {
doStuff: function (doc) {
// do stuff with doc ...
return doc;
}
};
}
function processDocument (id) {
var doc = db.myCollection.findOne({ _id : ObjectId(id)});
var myDocumentUtils = getMyDocumentUtils(); // added line
doc = myDocumentUtils.doStuff(doc); // need access to global myDocumentUtils object
db.myCollection.save(doc);
return doc;
};
然后将db.eval()
称为原始样式。