mongodb服务器端javascript实际上是客户端?

mongodb服务器端javascript实际上是客户端?,javascript,mongodb,server-side,mongo-shell,Javascript,Mongodb,Server Side,Mongo Shell,我收集了大量的文件,我想提取一些统计数据。它需要每15分钟定期执行一次 大多数统计数据都基于文档大小,因此我需要获取文档并计算其大小 我的统计数据的输出只是一行,其中包含一些关于文档大小的统计数据。(我没有获取整个集合,只是其中的一个子集,因此无法使用mongodb提供的集合统计信息) 我希望在服务器端执行此操作,并避免将所有文档传输到客户端(只是因为我需要计算大小) 我使用mongo shell执行它,确保我连接到一个辅助计算机,并且这个mongo shell始终在远程计算机上运行,因此这是避

我收集了大量的文件,我想提取一些统计数据。它需要每15分钟定期执行一次

大多数统计数据都基于文档大小,因此我需要获取文档并计算其大小

我的统计数据的输出只是一行,其中包含一些关于文档大小的统计数据。(我没有获取整个集合,只是其中的一个子集,因此无法使用mongodb提供的集合统计信息)

我希望在服务器端执行此操作,并避免将所有文档传输到客户端(只是因为我需要计算大小)

我使用mongo shell执行它,确保我连接到一个辅助计算机,并且这个mongo shell始终在远程计算机上运行,因此这是避免通过网络传输所有文档的主要原因

在阅读了MongoShell文档之后,我希望它能像它所说的那样在“服务器端”执行,但它不是这样工作的,它是在与MongoShell相同的机器上执行的(我认为它更多的是客户端而不是服务器端)

我正在粘贴我的代码摘录,以防万一:

db.cache.find(query).forEach(function(obj) {

        var curr = Object.bsonsize(obj); 

        if(stats.max < curr) {
            stats.max = curr;
            stats.maxid = obj._id;
        } 
        if(stats.min > curr) {
            stats.min = curr;
        } 
        stats.count++;
        stats.total += curr;

        stats.avg = stats.total/stats.count;
    })
db.cache.find(查询).forEach(函数(obj){
var curr=Object.bsonsize(obj);
如果(统计最大值<当前值){
stats.max=curr;
stats.maxid=obj.\u id;
} 
如果(stats.min>curr){
stats.min=curr;
} 
stats.count++;
统计总数+=货币;
stats.avg=stats.total/stats.count;
})
如果我在本地执行mongo shell,需要3-4秒,在远程执行的mongo shell中需要1分钟以上

有没有办法让这个服务器端javascript成为真正的服务器端执行

更新:

总结回答中提到的选项:

  • 使用
    system.js
    collection+
    db.eval
    :我不能使用它,因为
    eval
    已被弃用,但
    eval
    需要在主机上运行,我必须在辅助设备上运行

  • 使用
    system.js
    collection+
    loadServerScripts
    :它在mongo shell机器(即“客户端”)中执行javascript代码

  • cron作业:我需要在一个特定的节点上运行它,因为主节点可能会更改为另一个节点,所以我可以针对主节点运行它,这是我应该避免的。但是,我也不允许这样做,其中一个要求是在远程shell上运行它。(有几个像这样的数据库需要这种统计数据,而且只在一个地方保存比较容易)


您可以将js代码存储为一种存储过程

您可以将js存储为系统调用:

 db.system.js.save({_id: "sum", value: function (x, y) { return x + y; }});
那么就这样称呼它:

db.eval("return sum(2, 3);");
由于评估已折旧-没有设置禁用评估的时间

额外文件


eval
的另一个解决方案是使用
cron作业
调用本地存储在serverssh上的javascript文件到mongo服务器,在那里打开mongo shell,并在REPL中执行codejs,这显然是在REPL进程运行的同一台机器上执行的。只需直接在mongodb服务器上运行REPL。无法ssh到mongo服务器。这是一个prod环境,我将永远没有这样做的权限:(如何在mongodb服务器上直接运行REPL?感谢您的响应。我收到以下警告:“警告:db.eval已弃用”当使用eval.eval时,是否有其他方法不使用eval?使用loadServerScripts,它在mongo shell机器中执行,因此我再次遇到与以前相同的问题:(@richardtz,因为您可以访问mongo控制台-然后您可以发出:
db.loadServerScripts();
-我说的对吗?或者你会有一个用cron调用的脚本吗?不确定你说的mongo控制台是什么意思。我正在使用mongo shell来执行我的脚本。这个mongo shell在远程机器上运行。如果我使用eval,那么我的代码会在服务器上执行->很好,但不推荐使用。如果使用loadServerScripts,那么我的代码会被执行在远程机器上,而不是服务器上。@richardtz-另一个
eval
的解决方案是使用
cron作业
调用本地服务器上的javascript文件
db.loadServerScripts();
sum(3,2)