2013年1月6日星期日

MongoDB : 自定义函数在客户端shell调用和在server端调用,数据传输的差别


在server端定义了一个函数somefunc,把mapreduce的结果从 _id , value 的形式 flatten 展开


db.system.js.save({
_id : 'somefunc',
value : function(src_mr, dst_name){
d = db.createCollection(dst_name);
var src = db[src_mr];
var d = src.find();
var dst = db[dst_name];
while (d.hasNext()) {
var r =d.next();
var x = r._id;
x.value = r.value;
// some modify on x ....
dst.insert(x);
}
}
});



在客户端执行运算:


db.loadServerScripts();
somefunc('srcmr', 'dstmr');

会把srcmr的数据传回客户端,在客户端的机器算好了,再远程写入mongodb server,抓包可以看到网络流量较大。

在server端执行运算:


db.eval("somefunc('srcmr', 'dstmr');");

不会把数据传回客户端,而是在服务端mongdb进行计算,直接写入,抓包可以看到网络流量很小。



因此,可以在客户端调试小规模数据,实际应用时在server端db.eval执行。


没有评论:

发表评论