作者:sense宏江 | 来源:互联网 | 2014-05-28 16:53
在MongoDB的官方文档中关于Java操作的介绍,只给出了很简单的几个例子。这些例子虽然可以满足一定的需求,但是还并不是太完全。下面是我根据网页中的提示写的几个例子。1.背景。用JUnit4.8.2实现的单元测试的形式。测试数据:{uid:10,username:Jim,age:23
在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
documents = new ArrayList();
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 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的相结合可以得出比较复杂的查询条件。