Java通過mongo-java-driver-3.0+分頁查詢mongodb詳解

本文以mongo-java-driver-3.5.0.jar爲例

1 mongodb查詢語句查詢:

db.user.find().skip(1).limit(2) 與 db.user.find().limit(2).skip(1) 查詢結果一樣,都是先執行skip再limit,如果有sort排序,無論位置先後,最先執行順序 sort再skip再limit。
這裏寫圖片描述

2 兩種查詢方法:

2.1find((Bson) filter).limit(1).skip(1) 與 find((Bson) filter).skip(1).limit(1)結果一樣
注:先執行skip再limit,所以結果有一條

public static MongoCollection<Document> connect() {  
    @SuppressWarnings("resource")  
    MongoClient client = new MongoClient("127.0.0.1", 27017);  
    MongoDatabase db = client.getDatabase("test");  
    MongoCollection<Document> collection = db.getCollection("user");  
    return collection;
} 

@Test  
public void testLimitSkip1(){  
    int iid = 3, iid2 = 4;
    String name = "";
    String nickname = "";
    DBObject filter = new BasicDBObject();  
    if (iid >= 0) {
        filter.put("iid", new BasicDBObject("$gte", iid));          
    }
    // 得到iid<=4結果;
    // iid>=3條件被覆蓋,Document.append不適合在同一個結果添加多個條件
    if (iid2 >= 0) {
        if (iid >= 0) {
            BasicDBObject[] queryObjectAnd =  new BasicDBObject[] { new BasicDBObject("iid", new BasicDBObject("$gte", iid)),  
                    new BasicDBObject("iid", new BasicDBObject("$lte", iid2)) };
            filter.put("$and", queryObjectAnd);
} else {
filter.put("iid",  new BasicDBObject("$lte", iid2)); 
}

    }
    if (name != "") {
        filter.put("name",new BasicDBObject("$regex", name));
    }
    if (nickname != "") {
        filter.put("nickname",nickname);  
    }

    List<Document> results = new ArrayList<Document>();  
    // FindIterable<Document> iterables = connect().find((Bson) filter).skip(1).limit(1);  
    FindIterable<Document> iterables = connect().find((Bson) filter).limit(1).skip(1);  
    MongoCursor<Document> cursor = iterables.iterator();  
    while (cursor.hasNext()) {  
        results.add(cursor.next());  
    }   
    for(Document doc : results){  
        System.out.println(doc.toJson());  
    } 
}

這裏寫圖片描述

這裏寫圖片描述

2.2collection.aggregate(List<\Bson> filter)

2.2.1filter先加skip,後加limit
注:先執行skip再limit,所以該結果有一條

public static MongoCollection<Document> connect() {  
    @SuppressWarnings("resource")  
    MongoClient client = new MongoClient("127.0.0.1", 27017);  
    MongoDatabase db = client.getDatabase("test");  
    MongoCollection<Document> collection = db.getCollection("user");  
    return collection;
} 

@Test  
public void testSkipLimit(){  
    int iid = 3, iid2 = 4;
    String name = "";
    String nickname = "";
    DBObject filter = new BasicDBObject();  
    if (iid >= 0) {
        filter.put("iid", new BasicDBObject("$gte", iid));          
    }
    // 得到iid<=4結果;
    // iid>=3條件被覆蓋,Document.append不適合在同一個結果添加多個條件
    if (iid2 >= 0) {
        if (iid >= 0) {
            BasicDBObject[] queryObjectAnd =  new BasicDBObject[] { new BasicDBObject("iid", new BasicDBObject("$gte", iid)),  
                    new BasicDBObject("iid", new BasicDBObject("$lte", iid2)) };
            filter.put("$and", queryObjectAnd);
} else {
filter.put("iid",  new BasicDBObject("$lte", iid2)); 
}

    }
    if (name != "") {
        filter.put("name",new BasicDBObject("$regex", name));
    }
    if (nickname != "") {
        filter.put("nickname",nickname);  
    }
    DBObject matchBasicDBObjet = new BasicDBObject("$match", filter);
// DBObject sortBasicDBObjet = new BasicDBObject("$sort", new BasicDBObject("CreateTime",-1)); 
    DBObject skipBasicDBObjet = new BasicDBObject("$skip", 1);
DBObject limitBasicDBObjet = new BasicDBObject("$limit", 1); 
    List<Bson> listBsons = new ArrayList<Bson>();
    listBsons.add((Bson) matchBasicDBObjet);
    // listBsons.add((Bson) sortBasicDBObjet);
    // 先加skip,後加limit
    listBsons.add((Bson) skipBasicDBObjet);
    listBsons.add((Bson) limitBasicDBObjet);

    List<Document> results = new ArrayList<Document>();  
    AggregateIterable<Document> iterables = connect().aggregate(listBsons); 
    MongoCursor<Document> cursor = iterables.iterator();  
    while (cursor.hasNext()) {  
        results.add(cursor.next());  
    }  
    for(Document doc : results){  
        System.out.println(doc.toJson());  
    } 
}

這裏寫圖片描述

2.2.1filter先加limit,後加skip
注:先執行limit再skip,所以該結果有0條

public static MongoCollection<Document> connect() {  
    @SuppressWarnings("resource")  
    MongoClient client = new MongoClient("127.0.0.1", 27017);  
    MongoDatabase db = client.getDatabase("test");  
    MongoCollection<Document> collection = db.getCollection("user");  
    return collection;
} 

@Test  
public void testLimitSkip(){  
    int iid = 3, iid2 = 4;
    String name = "";
    String nickname = "";
    DBObject filter = new BasicDBObject();  
    if (iid >= 0) {
        filter.put("iid", new BasicDBObject("$gte", iid));          
    }
    // 得到iid<=4結果;
    // iid>=3條件被覆蓋,Document.append不適合在同一個結果添加多個條件
    if (iid2 >= 0) {
        if (iid >= 0) {
            BasicDBObject[] queryObjectAnd =  new BasicDBObject[] { new BasicDBObject("iid", new BasicDBObject("$gte", iid)),  
                    new BasicDBObject("iid", new BasicDBObject("$lte", iid2)) };
            filter.put("$and", queryObjectAnd);
} else {
filter.put("iid",  new BasicDBObject("$lte", iid2)); 
}

    }
    if (name != "") {
        filter.put("name",new BasicDBObject("$regex", name));
    }
    if (nickname != "") {
        filter.put("nickname",nickname);  
    }
    DBObject matchBasicDBObjet = new BasicDBObject("$match", filter);
// DBObject sortBasicDBObjet = new BasicDBObject("$sort", new BasicDBObject("CreateTime",-1)); 
    DBObject skipBasicDBObjet = new BasicDBObject("$skip", 1);
DBObject limitBasicDBObjet = new BasicDBObject("$limit", 2); 
    List<Bson> listBsons = new ArrayList<Bson>();
    listBsons.add((Bson) matchBasicDBObjet);
    // listBsons.add((Bson) sortBasicDBObjet);
    // 先加limit,後加skip
    listBsons.add((Bson) limitBasicDBObjet);
    listBsons.add((Bson) skipBasicDBObjet);

    List<Document> results = new ArrayList<Document>();  
    AggregateIterable<Document> iterables = connect().aggregate(listBsons); 
    MongoCursor<Document> cursor = iterables.iterator();  
    while (cursor.hasNext()) {  
        results.add(cursor.next());  
    }  
    for(Document doc : results){  
        System.out.println(doc.toJson());  // 0條結果
    } 
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章