`
裴小星
  • 浏览: 265836 次
  • 性别: Icon_minigender_1
  • 来自: 北京
博客专栏
8ccf5db2-0d60-335f-a337-3c30d2feabdb
Java NIO翻译
浏览量:27853
F3e939f0-dc16-3d6e-8c0b-3315c810fb91
PureJS开发过程详解
浏览量:74380
07a6d496-dc19-3c71-92cf-92edb5203cef
MongoDB Java ...
浏览量:63081
社区版块
存档分类
最新评论

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 并获取 collection
Mongo 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());
}

  看起来不错。我们可以直接通过 importClass 将 driver 相关的类导入进来。但这种语法形式还是太 “Java Way”了。
  何必用 put 、 get 来操作 DBObject ?能够直接用 JS Object 作为参数和返回值不是更好吗?

  接下来,就让我们看看实现了这一转换的开源项目 MongoDB Rhino 。


2. MongoDB Rhino

  MongoDB Rhino 是 Google Code 上的一个开源项目,项目主页:
  http://code.google.com/p/mongodb-rhino/

  它提供了强大的 BSON.to(..) 和 BSON.from(...) 方法,以实现 JavaScript 对象与 BSON 类的 Java 对象的互转,
  用法如下:
// 连接 MongoDB 并获取 collection
var 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))

  不过它是为标准 Rhino 设计的,为了将它应用于 Java 7 内置的 Rhino ,需要下载源代码,修改 import 的 package,并去掉JSON 类 (与 Java 7 自带的 JSON 类冲突了)。

  附件中是修改后的 MongoDB Rhino Driver 源码 (需要 Java 7 支持)。
  上面的示例中的 JSON.to(...) 需要替换为 Java 7 中的 JSON.stringify(...)。

3. pure.db.js


  MongoDB Rhino 仍然有一个缺点,就是每次使用时都需要调用 BSON.from(...) 和 BSON.to(...)。
  有没有办法对输入、输出参数进行统一处理?

  可能有人已经想到 proxy 模式或 AOP 之类的办法了。
  实际上,通过 Rhino JavaScript 引擎提供的利器 “__noSuchMethod__” (类似于 Ruby 中的 method_missing)就可以很容易地为 Java 对象创建一个 proxy。

  这也是解决 Java 对象与 JavaScript 对象不兼容的常用策略。
  我们无法像操作普通的 JavaScript Object 那样,将 JavaScript 函数附加到 Java 对象上,或者将Java 对象的方法赋值给一个 JavaScript 变量;
  但通过 “__noSuchMethod__” 的桥接作用,我们可以把对 JavaScript 对象(proxy)的方法的调用委托给 Java 对象,然后像操作普通的 JavaScript Object 那样扩展这个 proxy 对象。

  pure.db.js 就是按照这种思路实现的 (这个文件位于 Pure JS 工程中的 scripts/lib 下,可以在前一篇的附件中找到)。
  其用法如下:
// 连接 MongoDB 并获取 collection
var users = pure.db.get('users');

// 构造查询条件并获得返回值
var user = coll.get({ name: 'user1' });

// 输出查询结果
println(JSON.stringify(user));

  参数和返回值都是 JS Object,是不是更为简洁了?
  这里为 DBColletion 构造了一个 proxy,对输入的参数和返回的结果进行了统一处理,使得它的对外接口完全是JS Object 的形式。
  pure.db.js 的代码结构如下:
pure.db = function() {
		// 获取配置文件中指定的 DB
	var db = new Mongo().getDB(config.db.name),
		// 根据习惯设置的别名
		aliases = { get: 'findOne', list: 'find' },

		// proxy 方法(实现略)
		proxy = function(target) { ... };

	return {
		get: function(name) {
			// 请注意:这里为 DBCollection 创建了一个 proxy
			return proxy(db.getCollection(name));
		},
		eval: function(func) {
			// 如果参数是一个 Function,则将它转为 string
			if (func instanceof Function) {
				func = '(' + func + '())';
			}

			// 执行 DB.eval(...),实际参数为 string
			db.eval(func);
		},
		// 其他函数,一律使用 __noSuchMethod__ 委托到 DBCollection 上
		__noSuchMethod__: function(name, args) {
		 	return db[name].apply(db, args);
		}
	};
}();

  proxy 的实现实际上是创建了一个 “空” 对象,仅包含一个函数:“__noSuchMethod_”。
  将所有的函数调用委托为 Java 对象,但对参数和返回值进行了统一的处理。

  proxy 的实现如下:
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;
		}
	};
};

  以上就是 pure.db.js 的实现思路了。经过这层包装,我们可以更方便地使用 JavaScript 操作 MongoDB ;就像之前的例子中提到的那样,我们可以直接使用从前端传递过来的 JavaScript 对象与数据库交互了。当然最好还是先对客户端的输入进行做必要的检查。
4
1
分享到:
评论

相关推荐

    mongodb c#驱动最新驱动mongodb.driver.dll 版本2.12.0-beta1

    MongoDB 是一个流行的开源、基于分布式文件存储的数据库系统,主要设计用于处理大量数据的分布式环境。C# 驱动是 MongoDB 提供的一种客户端库,允许 .NET 开发者与 MongoDB 数据库进行交互。标题提到的是 MongoDB 的...

    MongoDB c#驱动 dll

    MongoDB.Driver.Core.dll实现了异步和同步的API,以适应不同的编程需求。 3. MongoDB.Driver.dll:这是C#驱动的主要部分,提供了面向对象的API来操作MongoDB数据库。开发者可以通过这个库创建数据库连接,执行查询...

    mongodb.dll 下载.zip

    在Windows上,通常会使用MongoDB的C++驱动或者基于.NET、Java、Python等平台的驱动。 2. **数据模型**:MongoDB使用文档型数据模型,文档是BSON(Binary JSON)格式,类似于JSON但包含更多数据类型。 3. **数据库...

    mongodb driver

    `MongoDB.Driver.dll`包含了与MongoDB通信的所有类和方法,如`MongoClient`、`IMongoDatabase`、`IMongoCollection`等,它们是实现数据库操作的基础。而`MongoDB.Bson.dll`提供了BSON(Binary JSON)的支持,BSON是...

    mongodb-driver-sync-4.2.3-API文档-中英对照版.zip

    赠送jar包:mongodb-driver-sync-4.2.3.jar; 赠送原API文档:mongodb-driver-sync-4.2.3-javadoc.jar; 赠送源代码:mongodb-driver-sync-4.2.3-sources.jar; 赠送Maven依赖信息文件:mongodb-driver-sync-4.2.3....

    随手记事(ssjs) 本系统为练手之作 用到的技术及前端库分别有: 1.nodejs 2.gmu 3.mongodb.zip

    1. **Node.js**:Node.js是基于Chrome V8引擎的JavaScript运行环境,它允许开发者使用JavaScript进行服务器端编程。Node.js的优势在于其事件驱动、非阻塞I/O模型,使得它在处理高并发请求时表现出色。在这个项目中,...

    mongodb-driver-core-4.2.3-API文档-中文版.zip

    赠送jar包:mongodb-driver-core-4.2.3.jar; 赠送原API文档:mongodb-driver-core-4.2.3-javadoc.jar; 赠送源代码:mongodb-driver-core-4.2.3-sources.jar; 赠送Maven依赖信息文件:mongodb-driver-core-4.2.3....

    mongodb-driver-sync-4.2.3-API文档-中文版.zip

    赠送jar包:mongodb-driver-sync-4.2.3.jar; 赠送原API文档:mongodb-driver-sync-4.2.3-javadoc.jar; 赠送源代码:mongodb-driver-sync-4.2.3-sources.jar; 赠送Maven依赖信息文件:mongodb-driver-sync-4.2.3....

    MongoDb db.createUser用户权限

    MongoDB 是一个流行的开源文档型数据库,以其灵活性和高性能而受到许多开发者的青睐。在MongoDB中,管理用户权限是数据库安全的重要环节。`db.createUser` 方法就是用于创建具有特定权限的用户的。以下是对 `db....

    基于Vue.js-Node.js-Mongodb 的本人本科毕业设计.zip

    它基于Chrome V8引擎,使得开发者可以用JavaScript编写服务器端程序,打破了传统意义上前后端分离的界限。Node.js采用事件驱动、非阻塞I/O模型,非常适合构建高并发、高性能的网络应用。在本设计中,Node.js可能被...

    课设项目:高校教学考试成绩管理系统(前端vue,后端js,数据库:mongoDB).zip,详情看我文章介绍

    课设项目:高校教学考试成绩管理系统,详情请看我的文章介绍:https://blog.csdn.net/weixin_43474701/article/details/144126919 web - 前端代码(vue) server - 后端代码(js) 数据库:mongoDB

    Backend system based on node.js + Mongodb. 基于 node.js + Mongodb

    在构建基于Node.js和MongoDB的后端系统时,我们涉及了多个关键技术和概念,这些都是构建现代Web应用程序的基础。Node.js作为一个高效的JavaScript运行环境,以其异步非阻塞I/O和事件驱动的特性,为开发高性能服务器...

    mongo-delphi-driver-master.zip_mongo delphi driver_mongodb资料

    这个“mongo-delphi-driver-master.zip”压缩包包含了该驱动的源代码和相关配置文件,是Delphi 7环境下开发MongoDB应用程序的重要参考资料。下面将详细阐述MongoDB Delphi驱动的相关知识点。 1. MongoDB Delphi ...

    nodejs-blog:具有Node.js,Express.js和MongoDB的博客

    【标题】:“Node.js-Blog:基于Node.js、Express.js和MongoDB的博客系统实现” 在Web开发领域,Node.js以其非阻塞I/O和事件驱动的特性,为构建高性能的网络应用提供了强大的支持。本项目“Node.js-Blog”正是利用...

    微信小程序-小商城后台(基于 Node.js、MongoDB、Redis 开发的系统...)

    微信小程序-小商城后台(基于 Node.js、MongoDB、Redis 开发的系统...) 项目说明: 基于 Node.js、MongoDB、Redis 开发的系统 基于 Express 提供 RESTful API 基于 apidoc 提供接口文档 基于 Angular.js、Ionic、...

    mongodb-driver-core-3.5.0.jar

    1. 连接管理:驱动程序能够创建、管理和关闭到MongoDB服务器的连接,实现连接池以提高性能和资源利用率。 2. 消息处理:它负责处理MongoDB协议的消息,包括查询、插入、更新、删除等操作的网络传输和解析。 3. 错误...

    Java连接mongoDB需要的jar包(3.9.1)

    这里提到的"Java连接mongoDB需要的jar包(3.9.1)"是指Java开发者用于连接MongoDB数据库的一组关键库文件,包括`bson-3.9.1.jar`、`mongodb-driver-3.9.1.jar`和`mongodb-driver-core-3.9.1.jar`。这些JAR文件是...

    ShadowEditor:基于three.js,golang和mongodb的跨平台3D场景编辑器,用于桌面和Web。 https:tengge1.github.ioShadowEditor-examples

    描述:基于three.js,golang和mongodb的跨平台3D场景编辑器。 来源: | 文件: | 演示: | 视频: | 资产: 技术堆栈:html,css,javascript,汇总,react.js,webgl,Three.js,golang,mongodb,nodejs,...

    Go-一个用于Go语言的MongoDBDriver

    `mongodb/mongo-go-driver`是官方支持的Go语言MongoDB驱动,它提供了与MongoDB服务器通信的接口和数据模型,使得Go程序员能够方便地操作MongoDB数据库。这个驱动遵循了MongoDB的官方规范,确保了良好的兼容性和稳定...

Global site tag (gtag.js) - Google Analytics