MongoDB学习系列12:Java实现对MongoDB的AND、OR和IN操作

在MongoDB的官方文档中关于Java操作的介绍,只给出了很简单的几个例子。这些例子虽然可以满足一定的需求,但是还并不是太完全。下面是我根据网页中的提示写的几个例子。
       1.背景。用JUnit4.8.2实现的单元测试的形式。测试数据:
[plain] view plaincopyprint?
{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"}  

      单元测试的初始化和清理工作,主要是建立数据库连接、写入测试数据、清理测试数据:
[java] view plaincopyprint?
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是比较简单的。
[java] view plaincopyprint?
@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操作。
[java] view plaincopyprint?
@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操作
[java] view plaincopyprint?
@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代替
[java] view plaincopyprint?
@Test  
public void testIn(){  
    DBObject queryCondition = new BasicDBObject();        
    //age in [13, 47]  
    queryCondition = new BasicDBObject();  
    BasicDBList values = new BasicDBList();  
    values.add(13);  
    values.add(47);  
    queryCondition.put("age", new BasicDBObject("$in", values));  
      
    DBCursor dbCursor = coll.find(queryCondition);  
    assertEquals(2, dbCursor.size());  
    assertEquals("tom", dbCursor.next().get("username"));  
}  

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




你可能感兴趣的:(MongoDB学习系列12:Java实现对MongoDB的AND、OR和IN操作)