2014-10-11 12 views
0

我正在尝试在我的nodejs/node-mongodb-native项目中使用MongoDB server-side JavaScript,只是感兴趣如何将我的自定义函数保存在MongoDB的全局上下文中并从db.eval脚本访问它们?如何在MongoBD的V8引擎中创建可通过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

第二个参数添加到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()作为您的原创风格。

+0

感谢您的响应,但我不能将JavaScript对象传递给eval函数,因为我使用nodejs。有没有解决方案呢? – Erik 2014-10-11 13:21:56

+0

@Erik,因为您可以将'processDocument'存储到数据库中,您是否还可以存储用于返回'myDocumentUtils'的另一个函数?这个函数可以由'processDocument'调用。 – Wizard 2014-10-11 14:01:02

+0

你能提供一些例子吗,因为我有点不明白你的建议:( – Erik 2014-10-11 14:13:35