您的位置:首页 > 数据库 > Mongodb

Java实现对MongoDB的AND、OR和IN操作

2015-09-23 16:23 615 查看
在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的相结合可以得出比较复杂的查询条件。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: