在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的相结合可以得出比较复杂的查询条件。 |