Java實現對MongoDB的AND、OR和IN操作

來源:互聯網
上載者:User

       在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;@BeforeClasspublic 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 BasicDBObjectBasicDBObject dbObject = new BasicDBObject();Iterator<String> joKeys = jo.keys();while(joKeys.hasNext()){String key = joKeys.next();dbObject.put(key, jo.get(key));}documents.add(dbObject);}}@Beforepublic void setUp(){//Insert all data into MongoDBfor(BasicDBObject bdo : documents){coll.insert(bdo);}}@Afterpublic void cleanUp(){//Drop the collection to remove all data.//Note: it's not recommended.coll.drop();}

            2. AND是比較簡單的。

@Testpublic void testAnd(){//agender='female' AND age > 27DBObject 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操作。

@Testpublic void testOrSingleField(){DBObject queryCondition = new BasicDBObject();//age<15 OR age>27queryCondition = 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操作

@Testpublic void testOrMultiFields(){DBObject queryCondition = new BasicDBObject();//agender=female OR age<=23queryCondition = 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代替

@Testpublic 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的相結合可以得出比較複雜的查詢條件。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.