mongdoDB的SELECT操作
public final DBObject find(DBObject o, DBObject fields);
第一个参数是查询参数类似与sql里的where后面的语句,第二个参数为需要查询的结果字段。
public void getTestData () throws Exception{ DBCollection coll=getConnection(host, port, dbName); BasicDBObject doc = new BasicDBObject(); doc.put("title", 0); BasicDBObject query = new BasicDBObject(); query.put("_id", "1"); query.put("title", "title"); DBCursor cur = coll.find(query, doc); while(cur.hasNext()){ System.out.println(cur.next()); } }
以上的代码为查询_id=1 and title='title'的结果,并将除了title字段外的其它所有字段显示。
doc.put("title", 0); 中的0的意思是不显示title字段,为1就是只显示title字段。在查询里0和1不能混用,要么都是0要么都是1.
不等于判断
query.put("_id", new BasicDBObject("$gt", 0).append("$lte", 3));
将红色部分的代码改成上面的代码
查询的是 _id > 0 and _id <=3的结果。
操作符有$gt 大于
$gte 大于等于
$lt 小于
$lte小于等于
$in包含
排序
DBCursor cur = coll.find(query, doc).sort(new BasicDBObject("created_at", -1));
将紫色部分的代码改成上面的代码
将查询结果根据created_at字段倒序排列。如果为1则为正序排列
分页
DBCursor cur = coll.find(query, doc).limit(10).skip(20);
将紫色部分的代码改成上面的代码
输出第20-30条,同 LIMIT 10 SKIP 20
模糊查询
使用正则表达式来进行模糊查询
Pattern john = Pattern.compile("^t",Pattern.CASE_INSENSITIVE); query.put("title", john);
上面的代码使用正则表达式模糊查询 like 't%'
子元素分页
查询部分子结果
如查询问题id=1的前三个答案
public void getTestData () throws Exception{ DBCollection coll=getConnection(host, port, dbName); List<Integer> range = new ArrayList<Integer>(); range.add(0); range.add(3); BasicDBObject query = new BasicDBObject(); BasicDBObject result = new BasicDBObject(); query.put("id", 1); result.put("ANSWERS", new BasicDBObject().append("$slice",range)); DBCursor cursor = coll.find(query, result); while(cursor.hasNext()){ System.out.println(cursor.next()); }
使用可以$slice读取子元素的部分结果,range用来控制读取的范围,第一个为正读、倒读,第二个为读取几条
db.question.find({}, {ANSWERS:{$slice: 5}}) // 前五条 db.question.find({}, {ANSWERS:{$slice: -5}}) // 最后五条 db.question.find({}, {ANSWERS:{$slice: [20, 10]}}) // skip 20, limit 10从20条开始读取10条 db.question.find({}, {ANSWERS:{$slice: [-20, 10]}}) // 20 from end, limit 10从最后20条开始读取10条
in的查询
public void getTestData () throws Exception{ DBCollection coll=getConnection(host, port, dbName); BasicDBObject query = new BasicDBObject(); List<Integer> range = new ArrayList<Integer>(); range.add(1); range.add(5); range.add(3); BasicDBObject result = new BasicDBObject(); query.put("id", new BasicDBObject("$in",range)); DBCursor cursor = coll.find(query, result); while(cursor.hasNext()){ System.out.println(cursor.next()); }
查询id in (1,2,5)的结果集
or 的查询
public void getTestData () throws Exception{ DBCollection coll=getConnection(host, port, dbName); BasicDBObject query = new BasicDBObject(); BasicDBObject result = new BasicDBObject(); List<BasicDBObject> range = new ArrayList<BasicDBObject>(); range.add(new BasicDBObject("id",1)); range.add(new BasicDBObject("title","xtitle3")); query.put("$or", range); DBCursor cursor = coll.find(query, result); while(cursor.hasNext()){ System.out.println(cursor.next()); }
查询id =1 or title=xtitle3 的结果集
子集合完全匹配
DBCollection coll=getConnection(host, port, dbName); BasicDBObject query = new BasicDBObject(); BasicDBObject result = new BasicDBObject(); List<Integer> range = new ArrayList<Integer>(); range.add(0); range.add(3); query.put("levels", new BasicDBObject("$all", range)); DBCursor cursor = coll.find(query, result);
查询levels里既有0又有3的记录, levels: [ 0,1, 2, 3 ]符合,levels: [ 1, 2, 3 ]不符合
判断字段是否存在
DBCollection coll=getConnection(host, port, dbName); BasicDBObject query = new BasicDBObject(); BasicDBObject result = new BasicDBObject(); query.put("levels", new BasicDBObject().append("$exists", true)); DBCursor cursor = coll.find(query, result);
如果levels存在,符合条件
db.questions.find( { id: { $ne : 3 } } );
格式
db.questions.find({id:{$nin: [2,4,6]}});
$size 判断子集的大小
DBCollection coll=getConnection(host, port, dbName); BasicDBObject query = new BasicDBObject(); BasicDBObject result = new BasicDBObject(); query.put("levels", new BasicDBObject().append("$size", 3)); DBCursor cursor = coll.find(query, result);
可以从这个找到levels的size=3的结果集,但是不能通过 $size 得到levels的大小,如果要得到大小,需要添加额外计数的字段,在更新levels时,更新计数
得到结果集的大小
coll.find(query, result).count();