如何在MongoDB的V8引擎中创建可通过db.eval访问的全局对象?

时间:2014-10-11 10:06:17

标签: javascript node.js mongodb node-mongodb-native

我正在尝试在我的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函数中访问?

1 个答案:

答案 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()称为原始样式。