Pure JS (4.3): pure.db.js 的实现(基于 MongoDB Rhino Driver)
Pure JS (4.3): pure.db.js 的实现(基于 MongoDB Rhino Driver)
接着之前的两篇文章,让我们来看看 pure.db.js 的实现细节,以及一些 MongoDB Driver 的相关内容。
1. MongoDB Java Driver
MongoDB Java Driver 可以到这里下载:
https://github.com/mongodb/mongo-java-driver/downloads
用法如下:
// 连接 MongoDB 并获取 collectionMongo m = new Mongo();DBCollection coll = db.getCollection("testCollection")// 构造查询条件并获得返回值BasicDBObject query = new BasicDBObject();query.put("i", 71);cur = coll.find(query);// 遍历输出查询结果while(cur.hasNext()) { System.out.println(cur.next());}
// 连接 MongoDB 并获取 collectionvar connection = new Mongo();var db = connection.getDB('mydatabase');var collection = db.getCollection('mycollection');// 构造查询条件并获得返回值var query = { name: /aRegularExpresison/i };var document = BSON.from(collection.findOne(BSON.to(query)));// 输出查询结果java.lang.System.println(JSON.to(document))
// 连接 MongoDB 并获取 collectionvar users = pure.db.get('users');// 构造查询条件并获得返回值var user = coll.get({ name: 'user1' });// 输出查询结果println(JSON.stringify(user));
pure.db = function() {// 获取配置文件中指定的 DBvar db = new Mongo().getDB(config.db.name),// 根据习惯设置的别名aliases = { get: 'findOne', list: 'find' },// proxy 方法(实现略)proxy = function(target) { ... };return {get: function(name) {// 请注意:这里为 DBCollection 创建了一个 proxyreturn proxy(db.getCollection(name));},eval: function(func) {// 如果参数是一个 Function,则将它转为 stringif (func instanceof Function) {func = '(' + func + '())';}// 执行 DB.eval(...),实际参数为 stringdb.eval(func);},// 其他函数,一律使用 __noSuchMethod__ 委托到 DBCollection 上__noSuchMethod__: function(name, args) { return db[name].apply(db, args);}};}();
proxy = function(target) {return {__noSuchMethod__: function(name, args) {// 函数名以 '$',表示将返回值转为数组var cursor = true;if (name.indexOf('$') === 0) {cursor = false;name = name.substr(1);};// 将别名转换为真实的方法名name = aliases[name] || name;// 将 object 类型的参数转换为 DBObject for (var i = 0; i < args.length; ++i) { if (typeof args[i] === 'object') { args[i] = BSON.to(args[i]); } }// 执行被代理的 Java 对象的对应方法var ret = target[name].apply(target, args);// 将 DBCursor 转为 JavaScript 数组(或保留原有形式,但创建 proxy)if (ret instanceof DBCursor) {ret = cursor ? proxy(ret) : BSON.from(ret.toArray());// 将 DBObject 转为 JavaScript Object} else if (ret instanceof DBObject) {ret = BSON.from(ret);}return ret;}};};