标签搜索

mongo shell实例

anker
2021-06-28 / 0 评论 / 9 阅读 / 正在检测是否收录...

这些脚本,本质就是JavaScript代码。不同版本的Mongo Shell支持的操作有所不同。这里是以4.2.0版本代码测试的。

另外官方的文档也至关重要。虽然是JavaScript语法,但是支持的MongoDB相关的模块会自动引入。而这些脚本的数据来源都使用这些接口。再比如预定义的变量db和函数printjson, 这些都不是标准的JavaScript提供的。

参考官方交互模式和脚本模式区别
mongodb-shell.jpg

演示源码:
//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

评论 (0)

取消