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

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

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

 

[plain]  view plain  copy
 
 print ?
  1. {uid:10,username:"Jim",age:23,agender:"male"}  
  2. {uid:27,username:"tom",age:13,agender:"male"}  
  3. {uid:12,username:"Jane",age:31,agender:"female"}  
  4. {uid:23,username:"Alex",age:47,agender:"male"}  
  5. {uid:109,username:"Lily",age:24,agender:"female"}  


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

 

 

[java]  view plain  copy
 
 print ?
  1. private static List<BasicDBObject> documents = new ArrayList<BasicDBObject>();  
  2. private static DBCollection coll;  
  3.   
  4. @BeforeClass  
  5. public static void init(){  
  6.     try {  
  7.           
  8.         initConnection();  
  9.           
  10.         loadData();  
  11.     } catch (Exception e) {  
  12.         e.printStackTrace();  
  13.     }  
  14. }  
  15.   
  16. private static void initConnection() throws UnknownHostException, MongoException{  
  17.     //Create a connection to Collection 'user'  
  18.     Mongo mongo = new Mongo("localhost"27017);  
  19.     DB db = mongo.getDB("test");  
  20.     coll = db.getCollection("user");  
  21. }  
  22.   
  23. private static void loadData() throws Exception{  
  24.     BufferedReader br = new BufferedReader(new InputStreamReader(MongoTest.class.getResourceAsStream("data")));  
  25.     String line = null;  
  26.     while((line = br.readLine()) != null){  
  27.         JSONObject jo = new JSONObject(line);  
  28.           
  29.         //Convert JSONObject into BasicDBObject  
  30.         BasicDBObject dbObject = new BasicDBObject();  
  31.         Iterator<String> joKeys = jo.keys();  
  32.         while(joKeys.hasNext()){  
  33.             String key = joKeys.next();  
  34.             dbObject.put(key, jo.get(key));  
  35.         }  
  36.           
  37.         documents.add(dbObject);  
  38.     }  
  39. }  
  40.   
  41. @Before  
  42. public void setUp(){  
  43.     //Insert all data into MongoDB  
  44.     for(BasicDBObject bdo : documents){  
  45.         coll.insert(bdo);  
  46.     }  
  47. }  
  48.   
  49. @After  
  50. public void cleanUp(){  
  51.     //Drop the collection to remove all data.  
  52.     //Note: it's not recommended.  
  53.     coll.drop();  
  54. }  


            2. AND是比较简单的。

 

 

[java]  view plain  copy
 
 print ?
  1. @Test  
  2. public void testAnd(){  
  3.     //agender='female' AND age > 27    
  4.     DBObject queryCondition = new BasicDBObject();  
  5.     queryCondition.put("agender""female");  
  6.     queryCondition.put("age"new BasicDBObject("$gt"27));  
  7.     DBCursor dbCursor = coll.find(queryCondition);  
  8.     assertEquals(1, dbCursor.size());  
  9.     assertEquals("Jane", dbCursor.next().get("username"));  
  10. }  


           3.单个字段的OR操作。

 

[java]  view plain  copy
 
 print ?
  1. @Test  
  2. public void testOrSingleField(){  
  3.     DBObject queryCondition = new BasicDBObject();        
  4.     //age<15 OR age>27  
  5.     queryCondition = new BasicDBObject();  
  6.     BasicDBList values = new BasicDBList();  
  7.     values.add(new BasicDBObject("age"new BasicDBObject("$gt"27)));  
  8.     values.add(new BasicDBObject("age"new BasicDBObject("$lt"15)));  
  9.     queryCondition.put("$or", values);  
  10.       
  11.     DBCursor dbCursor = coll.find(queryCondition);  
  12.     assertEquals(3, dbCursor.size());  
  13.     assertEquals("tom", dbCursor.next().get("username"));  
  14. }  

 

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

 

[java]  view plain  copy
 
 print ?
  1. @Test  
  2. public void testOrMultiFields(){  
  3.     DBObject queryCondition = new BasicDBObject();        
  4.     //agender=female OR age<=23  
  5.     queryCondition = new BasicDBObject();  
  6.     BasicDBList values = new BasicDBList();  
  7.     values.add(new BasicDBObject("agender""female"));  
  8.     values.add(new BasicDBObject("age"new BasicDBObject("$lte"23)));  
  9.     queryCondition.put("$or", values);  
  10.       
  11.     DBCursor dbCursor = coll.find(queryCondition);  
  12.     assertEquals(4, dbCursor.size());  
  13.     assertEquals("Jim", dbCursor.next().get("username"));  
  14. }  


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

 

 

[java]  view plain  copy
 
 print ?
  1. @Test  
  2. public void testIn(){  
  3.     DBObject queryCondition = new BasicDBObject();        
  4.     //age in [13, 47]  
  5.     queryCondition = new BasicDBObject();  
  6.     BasicDBList values = new BasicDBList();  
  7.     values.add(13);  
  8.     values.add(47);  
  9.     queryCondition.put("age"new BasicDBObject("$in", values));  
  10.       
  11.     DBCursor dbCursor = coll.find(queryCondition);  
  12.     assertEquals(2, dbCursor.size());  
  13.     assertEquals("tom", dbCursor.next().get("username"));  
  14. }  


         从以上几个例子可以看出,通过BasicDBList与BasicDBObject的相结合可以得出比较复杂的查询条件。

 

 

猜你喜欢

转载自xinjiatao.iteye.com/blog/2348981