日期:2014-05-16  浏览次数:20371 次

【转】Java实现对MongoDB的AND、OR和IN操作

MongoDB的官方文档中关于Java操作的介绍,只给出了很简单的几个例子。这些例子虽然可以满足一定的需求,但是还并不是太完全。下面是我根据网页中的提示写的几个例子。

? ? ? ?1.背景。用JUnit4.8.2实现的单元测试的形式。测试数据:

{uid:10,username:"Jim",age:23,agender:"male"}
{uid:27,username:"tom",age:13,agender:"male"}
{uid:12,username:"Jane",age:31,agender:"female"}
{uid:23,username:"Alex",age:47,agender:"male"}
{uid:109,username:"Lily",age:24,agender:"female"}

?

单元测试的初始化和清理工作,主要是建立数据库连接、写入测试数据、清理测试数据:

	private static List<BasicDBObject> documents = new ArrayList<BasicDBObject>();
	private static DBCollection coll;
	
	@BeforeClass
	public static void init(){
		try {
			
			initConnection();
			
			loadData();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	
	private static void initConnection() throws UnknownHostException, MongoException{
		//Create a connection to Collection 'user'
		Mongo mongo = new Mongo("localhost", 27017);
		DB db = mongo.getDB("test");
		coll = db.getCollection("user");
	}
	
	private static void loadData() throws Exception{
		BufferedReader br = new BufferedReader(new InputStreamReader(MongoTest.class.getResourceAsStream("data")));
		String line = null;
		while((line = br.readLine()) != null){
			JSONObject jo = new JSONObject(line);
			
			//Convert JSONObject into BasicDBObject
			BasicDBObject dbObject = new BasicDBObject();
			Iterator<String> joKeys = jo.keys();
			while(joKeys.hasNext()){
				String key = joKeys.next();
				dbObject.put(key, jo.get(key));
			}
			
			documents.add(dbObject);
		}
	}
	
	@Before
	public void setUp(){
		//Insert all data into MongoDB
		for(BasicDBObject bdo : documents){
			coll.insert(bdo);
		}
	}
	
	@After
	public void cleanUp(){
		//Drop the collection to remove all data.
		//Note: it's not recommended.
		coll.drop();
	}

?2. AND是比较简单的。

?

?

?

	@Test
	public void testAnd(){
		//agender='female' AND age > 27	
		DBObject queryCondition = new BasicDBObject();
		queryCondition.put("agender", "female");
		queryCondition.put("age", new BasicDBObject("$gt", 27));
		DBCursor dbCursor = coll.find(queryCondition);
		assertEquals(1, dbCursor.size());
		assertEquals("Jane", dbCursor.next().get("username"));
	}

?

?3.单个字段的OR操作。

	@Test
	public void testOrSingleField(){
		DBObject queryCondition = new BasicDBObject();		
		//age<15 OR age>27
		queryCondition = new BasicDBObject();
		BasicDBList values = new BasicDBList();
		values.add(new BasicDBObject("age", new BasicDBObject("$gt", 27)));
		values.add(new BasicDBObject("age", new BasicDBObject("$lt", 15)));
		queryCondition.put("$or", values);
		
		DBCursor dbCursor = coll.find(queryCondition);
		assertEquals(3, dbCursor.size());
		assertEquals("tom", dbCursor.next().get("username"));
	}

??4. 多个字段之间的OR操作

?

?

?

	@Test
	public void testOrMultiFields(){
		DBObject queryCondition = new BasicDBObject();		
		//agender=female OR age<=23
		queryCondition = new BasicDBObject();
		BasicDBList values = new BasicDBList();
		values.add(new BasicDBObject("agender", "female"));
		values.add(new BasicDBObject("age", new BasicDBObject("$lte", 23)));
		queryCondition.put("$or", values);
		
		DBCursor dbCursor = coll.find(queryCondition);
		assertEquals(4, dbCursor.size());
		assertEquals("Jim", dbCursor.next().get("username"));
	}

?

?5. 单个字段的IN操作。对于类似 where age=13 OR age=47的查询条件,就可以考虑使用IN代替

?

	@Test
	public void testIn(){
		DBObject queryCondition = new BasicDBObject();		
		//age in [13, 47]
		queryCondition = new BasicDBObject();
		BasicDBList values =