这些脚本,本质就是JavaScript代码。不同版本的Mongo Shell
支持的操作有所不同。这里是以4.2.0
版本代码测试的。
另外官方的文档也至关重要。虽然是JavaScript语法,但是支持的MongoDB相关的模块会自动引入。而这些脚本的数据来源都使用这些接口。再比如预定义的变量db
和函数printjson
, 这些都不是标准的JavaScript提供的。
演示源码:
//https://docs.mongodb.com/manual/tutorial/write-scripts-for-the-mongo-shell/#differences-between-interactive-and-scripted-mongo
function get_maxlv_user(hostid){
print("current in db:" + db.getName());
let coll_name = "game_" + hostid;
//在当前DB实例下获得另外一个DB对象
//方法1:
let coll = db.getSiblingDB(coll_name);
//方法2,支持连接其他实例
//conn = new Mongo();// 可传参数连接指定实例
//coll = conn.getDB(coll_name);
// 以上可以写为: db = connect("localhost:27020/myDatabase");
print("current in db:" + coll.getName());
// 以下列出DB列表
//print(db.adminCommand('listDatabases'));
//printjson(db.adminCommand('listDatabases'));
let iter = coll.user.find();
if (iter.count() == 0){
print("not found documents")
return ;
}else{
let map = new Map();
while(iter.hasNext()){
let doc = iter.next();
//print(typeof(doc.items.info));
let items = doc.items.info;
for (let key in items) {
//console.log(key, items[key]);
let one_item = items[key];
// 找到101类型
//print(one_item);
if (one_item.btype == 101){
// mongo shell 3.4不支持map.set
//map[doc.uid] = one_item.lv;
map.set(doc.uid, one_item.lv);
}
}
//map.set(doc.uid, items._i_104.lv);
//print("add ", doc.uid, doc.items.info._i_104.lv);
}
// 根据等级排序,a[1]表示value
let mapAsc = new Map([...map.entries()].sort((a,b) => a[1] - b[1]));
mapAsc.forEach(function(v, k){
print("uid:" + k, "item_lv:" + v);
})
print("total documents count:", iter.count());
}
iter.close();
}
get_maxlv_user(1)
脚本运行的方式
mongo host:port/db script.js
使用DB来排序,而不是脚本来排序
let iter = db.user.find({"items.info._i_104.btype":101}, {uid:1,"items.info._i_104.lv":1, _id:0}).sort({"items.info._i_104.lv":-1})
// print(typeof(iter)) --->object
//iter.forEach( function(iter) { print( "user: " + iter.uid, "lv:" + iter.items.info._i_104.lv ); } );
// iter -->https://docs.mongodb.com/v3.4/reference/method/js-cursor/
//print(iter.itcount(), iter.count())
let count = 0;
while(iter.hasNext()){
count++;
let doc = iter.next();
print(count, "uid:", doc.uid, "lv:" + doc.items.info._i_104.lv);
}
iter.close();
评论 (0)