mongo DB 同样支持存储过程,和别的一些数据库的不同的是 mongo 的 procedure 是以 javascript 形式存储在内部一个叫 system.js 的 collection 里的。可以使用 mongo 的 JDBC 驱动中的 API 对 procedure 进行动态的添加。
下面为代码demo:
Mongo mongo = new Mongo( "10.232.31.46" ,27015);
DB db = mongo.getDB( "dbName" );
if ( "username" != null ) {
boolean auth = db.authenticate( "username" ,
"password" == null ? new char [0] : "password" .toCharArray());
if (!auth) {
throw new MongoException( "authenticate failed!" );
}
}
// 获取存储 procedure 的 collection
DBCollection coll = db.getCollection( "system.js" );
BasicDBObject dbObject = new BasicDBObject();
dbObject.put( "_id" , "addNumbers" );
//procedure 的具体内容不能使用 string 类型存入,需要使用 driver 中定义的 code 类型
dbObject.put( "value" , new Code( "function(x, y){ return x + y; }" ));
// 将存储过程动态的添加到该集合中
coll.save(dbObject);
添加进去即可在进行查询等的时候调用 procedure 。如输入 {"$where":"addNumbers(a,1)==4"}
也可使用 db 的 eval() 方法直接测试调用 procedure 。如 db.eval("function(x, y){ return x + y; }", 3,4);
另:
我觉得也 可以使用 DB 中的 command() 方法,可以直接执行命令行里的命令,感觉也可以通过这种方法添加 procedure 。
上面是最近做项目需要用到自定义动态添加mongoDB的procedure,感觉可能还有许多错误的地方,以后深入了解了过后再校正。