Java通過mongo-java-driver-3.0+操作mongodb數據庫(增刪改查)

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

1 需要的jar包:https://pan.baidu.com/s/1jI3kB9W 密碼:79hv
mongo-java-driver-3.5.0.jar
junit-4.9.jar

2 spring-data-mongodb-1.8.0.RELEASE版本查詢mongodb數據庫時候,構造查詢條件時候會把大寫字母開頭字段名自動改成小寫字母開頭。
解決:由於spring+springmvc+hibernate5環境中會存在jar衝突,就沒有嘗試其他版本spring-data-mongodb,直接採用mongo-java-driver操作mongodb。
mongo-java-driver-3.5.0接口地址:http://mongodb.github.io/mongo-java-driver/3.5/javadoc/

// 1.8.0.RELEASE版本中,執行下面語句時候,mongodb的字段名'Name'自動變爲'name'
// 會報錯:mongodb中找不到'name'字段
mongoTemplate.findOne(new Query(Criteria.where("Name").is("testMongodb")), User.class, "collectionName");

3 mongo-java-driver操作mongodb代碼(增刪改查,細節已在註釋中給出,比如多條件查詢有兩種條件組合方法:Document.append和Filters)

3.1 MongoDb.java

package mongo.mongodb;  

import java.util.ArrayList;  
import java.util.List;  

import org.bson.Document;  
import org.bson.conversions.Bson;  

import com.mongodb.MongoClient;  
import com.mongodb.client.FindIterable;  
import com.mongodb.client.MongoCollection;  
import com.mongodb.client.MongoCursor;  
import com.mongodb.client.MongoDatabase;  
import com.mongodb.client.result.UpdateResult;  

public class MongoDb {  
    private static MongoCollection<Document> collection;  

    /** 
     * 鏈接數據庫 
     *  
     * @param databaseName 
     *            數據庫名稱 
     * @param collectionName 
     *            集合名稱 
     * @param hostName 
     *            主機名 
     * @param port 
     *            端口號 
     */  
    public static void connect(String databaseName, String collectionName,  
            String hostName, int port) {  
        @SuppressWarnings("resource")  
        MongoClient client = new MongoClient(hostName, port);  
        MongoDatabase db = client.getDatabase(databaseName);  
        collection = db.getCollection(collectionName);  
        System.out.println(collection);  
    }  

    /** 
     * 插入一個文檔 
     *  
     * @param document 
     *            文檔 
     */  
    public static void insert(Document document) {  
        collection.insertOne(document);  
    }  

    /** 
     * 查詢所有文檔 
     *  
     * @return 所有文檔集合 
     */  
    public static List<Document> findAll() {  
        List<Document> results = new ArrayList<Document>();  
        FindIterable<Document> iterables = collection.find();  
        MongoCursor<Document> cursor = iterables.iterator();  
        while (cursor.hasNext()) {  
            results.add(cursor.next());  
        }  

        return results;  
    }  

    /** 
     * 根據條件查詢 
     *  
     * @param filter 
     *            查詢條件 //注意Bson的幾個實現類,BasicDBObject, BsonDocument, 
     *            BsonDocumentWrapper, CommandResult, Document, RawBsonDocument 
     * @return 返回集合列表 
     */  
    public static List<Document> findBy(Bson filter) {  
        List<Document> results = new ArrayList<Document>();  
        FindIterable<Document> iterables = collection.find(filter);  
        MongoCursor<Document> cursor = iterables.iterator();  
        while (cursor.hasNext()) {  
            results.add(cursor.next());  
        }  

        return results;  
    }  

    /** 
     * 更新查詢到的第一個 
     *  
     * @param filter 
     *            查詢條件 
     * @param update 
     *            更新文檔 
     * @return 更新結果 
     */  
    public static UpdateResult updateOne(Bson filter, Bson update) {  
        UpdateResult result = collection.updateOne(filter, update);  

        return result;  
    }  

    /** 
     * 更新查詢到的所有的文檔 
     *  
     * @param filter 
     *            查詢條件 
     * @param update 
     *            更新文檔 
     * @return 更新結果 
     */  
    public static UpdateResult updateMany(Bson filter, Bson update) {  
        UpdateResult result = collection.updateMany(filter, update);  

        return result;  
    }  

    /** 
     * 更新一個文檔, 結果是replacement是新文檔,老文檔完全被替換 
     *  
     * @param filter 
     *            查詢條件 
     * @param replacement 
     *            跟新文檔 
     */  
    public static UpdateResult replaceOne(Bson filter, Document replacement) {  
        UpdateResult result = collection.replaceOne(filter, replacement);  
         return result;
    }  

    /** 
     * 根據條件刪除一個文檔 
     *  
     * @param filter 
     *            查詢條件 
     */  
    public static void deleteOne(Bson filter) {  
        collection.deleteOne(filter);  
    }  

    /** 
     * 根據條件刪除多個文檔 
     *  
     * @param filter 
     *            查詢條件 
     */  
    public static void deleteMany(Bson filter) {  
        collection.deleteMany(filter);  
    }  
}  

3.2 MongoTest

package mongo.mongodb;  

import java.util.List;  




import org.bson.Document;  
import org.bson.conversions.Bson;
import org.junit.Before;  
import org.junit.Test;  




import com.mongodb.BasicDBObject;
import com.mongodb.client.model.Filters;
import com.mongodb.client.result.UpdateResult;  

public class MongoTest   
{  
    @Before  
    public void before(){  
        MongoDb.connect("test", "user", "127.0.0.1", 27017);  
    }  

    /**
     * 插入測試
     */
    @Test  
    public void testInsert(){  
        Document document = new Document();  
        document.append("name", "nie").append("password", "nie").append("nickname", "nn").append("iid", 8);  
        MongoDb.insert(document);  
    }  

    /**
     * 查詢全部記錄
     */
    @Test  
    public void testFindAll(){  
        List<Document> results = MongoDb.findAll();  
        for(Document doc : results){  
            System.out.println(doc.toJson());  
        }  
    }  

    /**
     * 精確查詢
     */
    @Test
    public void testFindByExactQuery(){  
        Document filter = new Document();  
        filter.append("name", "yy");
        filter.append("nickname", "ygirl");  
        List<Document> results = MongoDb.findBy(filter);  
        for(Document doc : results){  
            System.out.println(doc.toJson());  
        }  
    }  

    /**
     * 模糊,精確混合查詢
     * 利用Document.append隨意添加條件
     */
    @Test  
    public void testFindByLickQuery1(){  
        int iid = 2;
        String name = "";
        String nickname = "";
        Document filter = new Document(); 
        if (iid >= 0) {
            filter.append("iid", new Document("$gte", 2));
        }
        if (name != "") {
            filter.append("name",new Document("$regex", "y"));
        }
        if (nickname != "") {
            filter.append("nickname","ygirl2");  
        }

        List<Document> results = MongoDb.findBy(filter); 
        for(Document doc : results){  
            System.out.println(doc.toJson());  
        }  
    } 

    /**
     * 模糊,精確混合查詢
     * 利用Filters隨意添加條件,條件越多越麻煩
     */
    @Test  
    public void testFindByLickQuery2(){  
        int iid = 2;
        String name = "y";
        String nickname = "ygirl2";
        Bson filter = null;
        if (iid >= 0) {
            if (name != "") {
                if (nickname != "") {
                    filter = Filters.and(Filters.gte("iid", iid), Filters.eq("nickname", nickname), Filters.regex("name", name));
                } else {
                    filter = Filters.and(Filters.gte("iid", iid), Filters.regex("name", name));
                }
            } else {
                if (nickname != "") {
                    filter = Filters.and(Filters.gte("iid", iid), Filters.eq("nickname", nickname));
                } else {
                    filter = Filters.and(Filters.gte("iid", iid));
                }
            }
        } else {
            if (name != "") {
                if (nickname != "") {
                    filter = Filters.and(Filters.eq("nickname", nickname), Filters.regex("name", name));
                } else {
                    filter = Filters.and(Filters.regex("name", name));
                }
            } else {
                if (nickname != "") {
                    filter = Filters.and(Filters.eq("nickname", nickname));
                } else {
                    filter = Filters.and();
                }
            }
        }
        List<Document> results = MongoDb.findBy(filter);
        for(Document doc : results){  
            System.out.println(doc.toJson());  
        }  
    }  


    /**
     * Document  OR  AND 查詢
     */
    @Test  
    public void testFindByOrAnd(){   
        // (查詢iid等於2或者iid等於8的數據)  失敗   只能查到8
        Document filter = new Document(); 
        filter.append("iid", 2);
        filter.append("iid", 8);
        List<Document> results = MongoDb.findBy(filter);

        // $or (查詢iid等於2或者iid等於8的數據)  
        BasicDBObject queryObjectOr = new BasicDBObject().append(  
                "$or",  
                new BasicDBObject[] { new BasicDBObject("iid", 2),  
                        new BasicDBObject("iid", 8) }); 

        // (查詢iid等於2並且name等於nie的數據)   成功查出相應數據
        Document filter2 = new Document(); 
        filter2.append("iid", 2);
        filter2.append("name", "yy");
        List<Document> results2 = MongoDb.findBy(filter2);

        // $and(查詢iid等於2並且name等於nie的數據)  
        BasicDBObject queryObjectAnd = new BasicDBObject().append("$and",  
                new BasicDBObject[] { new BasicDBObject("iid", 2),  
                        new BasicDBObject("name", "yy") });  
        List<Document> results3 = MongoDb.findBy(queryObjectOr); 
        List<Document> results4 = MongoDb.findBy(queryObjectAnd);
        for(Document doc : results){  
            System.out.println(doc.toJson());  
        }  
        System.out.println("==========");  
        for(Document doc : results3){  
            System.out.println(doc.toJson());  
        }  
        System.out.println("==========");  
        for(Document doc : results4){  
            System.out.println(doc.toJson());  
        } 
        System.out.println("==========");  
        for(Document doc : results2){  
            System.out.println(doc.toJson());  
        } 
    } 


    /**
     * Document  in  nin 查詢
     */
    @Test  
    public void testFindByInNin(){   

        // $in  (查詢iid爲1和2的數據)
        BasicDBObject queryObjectIn = new BasicDBObject().append("iid", new BasicDBObject(  
                "$in", new int[] { 2, 8 })); 
        // $nin  (查詢iid不爲1,2,3,4,5,6,7,8,9的數據)
        BasicDBObject queryObjectNin = new BasicDBObject().append("iid", new BasicDBObject(
                "$nin", new int[] { 2, 9 })); 
        List<Document> results3 = MongoDb.findBy(queryObjectIn); 
        List<Document> results4 = MongoDb.findBy(queryObjectNin);
        for(Document doc : results3){  
            System.out.println(doc.toJson());  
        }  
        System.out.println("==========");  
        for(Document doc : results4){  
            System.out.println(doc.toJson());  
        } 
    } 

    /**
     * 更新符合條件的第一條記錄的字段
     * 用"$set"更新
     */
    @Test  
    public void testUpdateOne(){  
        Document filter = new Document();  
        filter.append("nickname", "ygirl");  

        List<Document> results = MongoDb.findBy(filter); 
        for(Document doc : results){  
            System.out.println(doc.toJson());  
        }  

        Document filter2 = new Document();  
        filter2.append("nickname", "ygirl1"); 

        //注意update文檔裏要包含"$set"字段  
        Document update = new Document();  
        update.append("$set", new Document("nickname", "ygirl1").append("password", "ygirl1"));  
        UpdateResult result = MongoDb.updateOne(filter, update);

        System.out.println("matched count = " + result.getMatchedCount()); 
        List<Document> results1 = MongoDb.findBy(filter); 
        for(Document doc : results1){  
            System.out.println(doc.toJson());  
        }
        System.out.println("============= ");
        List<Document> results2 = MongoDb.findBy(filter2); 
        for(Document doc : results2){  
            System.out.println(doc.toJson());  
        }  
    }  

    /**
     * 更新符合條件的所有記錄的字段
     * 用"$set"更新
     */
    @Test  
    public void testUpdateMany(){  
        Document filter = new Document();  
        filter.append("nickname", "ygirl");  

        List<Document> results = MongoDb.findBy(filter); 
        for(Document doc : results){  
            System.out.println(doc.toJson());  
        }  


        //注意update文檔裏要包含"$set"字段  
        Document update = new Document();  
        update.append("$set", new Document("nickname", "ygirl1").append("password", "ygirl1"));  
        UpdateResult result = MongoDb.updateMany(filter, update);
        System.out.println("matched count = " + result.getMatchedCount());
    }  

    /**
     * 更新符合條件的第一條記錄的字段
     * 不用"$set"更新
     */
    @Test  
    public void testReplace(){  
        Document filter = new Document();  
        filter.append("nickname", "ygirl1");  

        List<Document> results = MongoDb.findBy(filter); 
        for(Document doc : results){  
            System.out.println(doc.toJson());  
        }  


        //注意:更新文檔時,不需要使用"$set" 
        Document update = new Document();  
        update.append("nickname", "ygirl").append("password", "123");  
        UpdateResult result = MongoDb.replaceOne(filter, update);
        System.out.println("matched count = " + result.getMatchedCount());

    }  

    /**
     * 刪除符合條件的第一條記錄
     */
    @Test  
    public void testDeleteOne(){  
        Document filter = new Document();  
        filter.append("nickname", "ygirl1");
        List<Document> results = MongoDb.findBy(filter); 
        for(Document doc : results){  
            System.out.println(doc.toJson());  
        }  
        MongoDb.deleteOne(filter);  
        List<Document> results2 = MongoDb.findBy(filter); 
        System.out.println("========"); 
        for(Document doc : results2){  
            System.out.println(doc.toJson());  
        }  
    }  

    /**
     * 刪除符合條件的所有記錄
     */
    @Test  
    public void testDeleteMany(){  
        Document filter = new Document();  
        filter.append("nickname", "ygirl1");
        List<Document> results = MongoDb.findBy(filter); 
        for(Document doc : results){  
            System.out.println(doc.toJson());  
        }  
        MongoDb.deleteMany(filter);  
        List<Document> results2 = MongoDb.findBy(filter); 
        System.out.println("========"); 
        for(Document doc : results2){  
            System.out.println(doc.toJson());  
        }  
    }  
}  

3.3 QueryOperators.java(非運行必須,操作數據庫用到關鍵字)

package mongo.mongodb;  


/** 
 * MongoDB keywords for various query operations 
 * 
 * @author yanzi 
 */  
public class QueryOperators {
    // $or或者,相當於sql  or
    //BasicDBObject queryObjectOr = new BasicDBObject().append(QueryOperators.OR, 
    //new BasicDBObject[] { new BasicDBObject("iid", 2), new BasicDBObject("iid", 8) });    
    public static final String OR = "$or";  
    // $and並且,相當於sql  and
    public static final String AND = "$and";  

    // $gt 大於
    public static final String GT = "$gt"; 
    // $gte 大於等於
    public static final String GTE = "$gte";
    // $lt 小於
    public static final String LT = "$lt";
    // $lte 小於等於
    public static final String LTE = "$lte";  

    public static final String NE = "$ne";  
    public static final String IN = "$in";  
    public static final String NIN = "$nin";  
    public static final String MOD = "$mod";  
    public static final String ALL = "$all";  
    public static final String SIZE = "$size";  
    public static final String EXISTS = "$exists";
    public static final String ELEM_MATCH = "$elemMatch"; 
 // $regex 模糊匹配,相當於sql中like
    public static final String REGEX = "$regex";

    // (to be implemented in QueryBuilder)  
    public static final String WHERE = "$where";  
    public static final String NOR = "$nor";  
    public static final String TYPE = "$type";  
    public static final String NOT = "$not";  

    // geo operators  
    public static final String WITHIN = "$within";  
    public static final String NEAR = "$near";  
    public static final String NEAR_SPHERE = "$nearSphere";  
    public static final String BOX = "$box";  
    public static final String CENTER = "$center";  
    public static final String POLYGON = "$polygon";  
    public static final String CENTER_SPHERE = "$centerSphere";  
    // (to be implemented in QueryBuilder)  
    public static final String MAX_DISTANCE = "$maxDistance";  
    public static final String UNIQUE_DOCS = "$uniqueDocs";  


    // meta query operators (to be implemented in QueryBuilder)  
    public static final String RETURN_KEY = "$returnKey";  
    public static final String MAX_SCAN = "$maxScan";  
    public static final String ORDER_BY = "$orderby";  
    public static final String EXPLAIN =  "$explain";  
    public static final String SNAPSHOT = "$snapshot";  
    public static final String MIN = "$min";  
    public static final String MAX = "$max";  
    public static final String SHOW_DISK_LOC = "$showDiskLoc";  
    public static final String HINT = "$hint";  
    public static final String COMMENT = "$comment";  


    // 其他關鍵字
    // $set 更新記錄,
    // Document update = new Document();  
    // update.append("$set", new Document("nickname", "ygirl1").append("password", "ygirl1"));
    public static final String SET = "$set";  
}  

4 參考文章
http://blog.csdn.net/maosijunzi/article/details/42100535

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章