Java mongodb System.js 应用

近期遇到了一个比较麻烦的查询,就想用mongodb system.js实现,有点类似关系型数据库的存储过程的味道。

system.js是每个数据库都会有的一个特殊集合,用来存放js的变量,可以在db.eval,mapreduce,where多个地方全局调用,比较方便。

下面是mongodb脚本和java 调用部分代码:

db.system.js.remove({_id:"calculateIdleRoomByTime"});

// 这个可以将正常的会议室查询出来,但是自己实现Java Bson to JavaBean的部分,比较麻烦
db.system.js.<strong><span style="color:#009900;">insert</span></strong>({_id:"calculateIdleRoomByTime",value:function(startTime,endTime){
   var roomIds = [],
        rooms = [];

    // 根据时间将被占用的会议室编号查询出来
    var cursor =  db.conference.find({isDel:false,$or:[
            {beginTime:{$gte:startTime},endTime:{$lte:endTime}},
            {$or:[
                    // 开始时间不在区间内
                    {beginTime:{$lt:startTime},endTime:{$gt:startTime}},
                    // 结束时间不在区间内
                    {beginTime:{$lt:endTime},endTime:{$gt:endTime}}
                ]
            }
        ]});
    while(cursor.hasNext()){
        var _conference =  cursor.next();
        if(_conference.location){
            roomIds.push(_conference.location.$id);
        }
    }
    // read idle rooms
    cursor = db.conferenceRoom.find({_id:{$nin:roomIds}});
    while(cursor.hasNext()){
        rooms.push(cursor.next());
    }
    return rooms;
}});

// 正式环境使用的是这个,查询被占用的会议室编号。然后Java Driver 使用$nin查询出正常的会议室
db.system.js.insert({_id:"calculateNotIdleRoomIdsByTime",value:function(startTime,endTime){
   var roomIds = [],
        rooms = [];

    // 根据时间将被占用的会议室编号查询出来
    var cursor =  db.conference.find({isDel:false,$or:[
            {beginTime:{$gte:startTime},endTime:{$lte:endTime}},
            {$or:[
                    // 开始时间不在区间内
                    {beginTime:{$lt:startTime},endTime:{$gt:startTime}},
                    // 结束时间不在区间内
                    {beginTime:{$lt:endTime},endTime:{$gt:endTime}}
                ]
            }
        ]});
    while(cursor.hasNext()){
        var _conference =  cursor.next();
        if(_conference.location){
            roomIds.push(_conference.location.$id);
        }
    }
    return roomIds;
}});

db.eval("calculateIdleRoomByTime(8,9)");
db.eval("calculateNotIdleRoomIdsByTime(2,14)"); 

// 简单例子
db.system.js.insert({_id:"max",value:function(a,b){return a>b?a:b;}});
db.eval("max(2,399)");	// 399

Java调用:

/**
	 * 根据时间查询空闲会议室
	 * @author Bill
	 * @since V.10 2015年4月21日 - 上午10:03:57
	 * @param startTime
	 * @param endTime
	 * @return
	 */
	@SuppressWarnings("unchecked")
	public List<ConferenceRoom> findByTime(long startTime, long endTime) {
		<span style="color:#009900;">Object result = mongoTemplate.getDb().eval("calculateNotIdleRoomIdsByTime("+startTime+","+endTime+")");</span>
		DBObject callResult = (DBObject) JSON.parse(JSON.serialize(result));
		Set<Entry<String, ObjectId>> notIdleRoomIdSets = callResult.toMap().entrySet();

		List<ObjectId> notIdleRoomIds = new ArrayList<ObjectId>();
		for (Entry<String, ObjectId> entry : notIdleRoomIdSets) {
			notIdleRoomIds.add(entry.getValue());
		}

		BasicQuery bq = new BasicQuery(
				new BasicDBObject("isDel", false)
				.append("_id", new BasicDBObject("$nin", notIdleRoomIds))
		);

		return find(bq);
	}

挺有意思 。

时间: 2024-10-22 05:16:55

Java mongodb System.js 应用的相关文章

MongoDB -- system.js

system.js MongoDB存储javascript函数的地方 与python配合用 MongoDB -- system.js

Atitit。Tree文件解析器的原理流程与设计实现&#160;&#160;java&#160;&#160;c#&#160;php&#160;js

Atitit.Tree文件解析器的原理流程与设计实现  java  c# php js 1. 解析原理与流程1 1.1. 判断目录  ,表示服  dirFlagChar = "└├─";1 1.2. 剑豪制表符出现的位置与文件夹级别对应表1 1.3. 主要判读流程2 2. Tree结果2 3. Code----3 4. 结果5 1. 解析原理与流程 1.1. 判断目录  ,表示服  dirFlagChar = "└├─"; 其中-类似于剑豪的制表符是表示目录的..够

java调用javascript :js引擎rhino

java调用javascript :js引擎rhino JavaJavaScriptEclipse脚本SQL 前段时间,在浏览javaeye论坛,看见有人征集如何在java中运行数学表达式.结果方案五花八门:1.jakarta commons JEXL. 2.Beanshell3.Java Math Expression Parser jep 4.parse combinator jparsec 5.jdk 6.0的 script6.利用SQL 7.自己写语法分析如果自己写语法分析,没有个200

【MongoDB数据库】Java MongoDB CRUD Example

上一篇我们讲了MongoDB 的命令入门初探,本篇blog将基于上一篇blog所建立的数据库和表完毕一个简单的Java MongoDB CRUD Example,利用Java连接MongoDB数据库.并实现创建数据库.获取表.遍历表中的对象.对表中对象进行CRUD操作等例程. 1.下载MongoDB Java 支持驱动包 [gitHub下载地址]https://github.com/mongodb/mongo-java-driver/downloads 2.建立Javaproject,并导入ja

java中执行js代码

要在java中执行js代码,首先明白,java不支持浏览器本身的方法.支持自定义的js方法,否则会报错 先新建一个js文件:jsss.js 内容如下: function aa(a,b){ return a+b; } 然后在java中写代码: public class ZipTest { public static void main(String[] args) throws Exception { ScriptEngineManager manager = new ScriptEngineMa

java MongoDB查询(二)复杂查询

前言 在上篇<java MongoDB查询(一)简单查询>中我们简单了解了下查询,但是仅仅有那些查询是不够用的,还需要复杂的查询,这篇就这点进行叙述. 1.数据结构 集合:firstCollection 数据内容: { "_id" : ObjectId("55adba52fa1f3cf038c2aea6"), "name" : "user0", "age" : 22, "sex&quo

Java MongoDB : Save image example

Java MongoDB : Save image example In this tutorial, we show you how to save an image file into MongoDB, via GridFS API. The GridFS APIs are able to serve other binary files as well, like video and music files. 译:在本教程中,我们将向你展示如何通过 GridFS API 保存一个图片到Mo

Java mongodb api疑问之MongoCollection与DBCollection

在学习Java mongodb api时发现,可以调用不同的java mongodb api来连接数据库并进行相关操作. 方式一: 该方式使用mongoClient.getDB("xxx")来获取DB对象,然后通过getCollection("xxx")获取相应的集合.其他操作略. import com.mongodb.BasicDBObject; import com.mongodb.DBCollection; import com.mongodb.DBObjec

java中System.getenv和System.getProperties的区别

System.getenv获取的是系统的环境变量(就是用户在操作系统中设置的环境变量),windows和linux下环境变量的设置就不说了哦. System.getProperties获取的是系统的相关属性.在java api文档中已经列出了如下属性 如果我们要在java程序启动就能获取自定义的系统属性我们可以使用 java –Dname=zhuhui 这样我们就在系统属性中设置了名称为myname值为zhuhui的系统属性,那么就可以通过System.getProperty("name&quo