在MongoDB的官方文档中关于
Java
操作的介绍,只给出了很简单的几个例子。这些例子虽然可以满足一定的需求,但是还并不是太完全。下面是我根据网页中的提示写的几个例子。
单元测试的初始化和清理工作,主要是建立数据库连接、写入测试数据、清理测试数据:
2. AND是比较简单的。
3.单个字段的OR操作。
5. 单个字段的IN操作。对于类似 where age=13 OR age=47的查询条件,就可以考虑使用IN代替
从以上几个例子可以看出,通过BasicDBList与BasicDBObject的相结合可以得出比较复杂的查询条件。
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 = 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的相结合可以得出比较复杂的查询条件。