1. 程式人生 > >MongoDB 程式設計(Idea 安裝加配置)

MongoDB 程式設計(Idea 安裝加配置)

MongoDB 安裝

進入 /usr/local

cd /usr/local

下載

sudo curl -O https://fastdl.mongodb.org/osx/mongodb-osx-x86_64-3.4.2.tgz

解壓

sudo tar -zxvf mongodb-osx-x86_64-3.4.2.tgz

重新命名為 mongodb 目錄

sudo mv mongodb-osx-x86_64-3.4.2 mongodb

MongoDB 設定環境變數

cd ~/

touch .bash_profile

open -e .bash_profile

PATH=$PATH:/usr/local/mongodb/bin
export PTAH

source .bash_profile

MongoDB 使用

sudo mkdir -p /data/db

啟動 mongodb,預設資料庫目錄即為 /data/db:sudo mongod

如果沒有建立全域性路徑 PATH,需要進入以下目錄

cd /usr/local/mongodb/bin
sudo ./mongod

開啟另一個命令列作為客戶端:

$ cd /usr/local/mongodb/bin
$ ./mongo
MongoDB shell version v3.4.2
connecting to: mongodb://127.0.0.1:27017
MongoDB server version: 3.4.2
Welcome to the MongoDB shell.
……

1 + 1
2

idea下的外掛安裝及配置

FileSettings…Plugins

Browse repositories…

Mongo Plugin

簡要介紹

首先建立 MongoClient 和 MongoDatabase,操縱 MongoCollection 物件插入 Document(Bson)。

示例程式碼

package demo;

import com.mongodb.MongoClient;
import com.mongodb.MongoClientOptions;
import com.mongodb.ServerAddress;
import com.mongodb.client.FindIterable;
import com.mongodb.client.MongoCollection;
import com.mongodb.client.MongoDatabase;
import org.bson.Document;

import java.net.UnknownHostException;

/**
 * 儲存物件API
 */
public class MongoAPIDemo {
    public static void main(String[] args) throws UnknownHostException {
        // 第一:例項化mongo物件,連線mongodb伺服器 包含所有的資料庫
        // 預設構造方法,預設是連線本機,埠號預設是27017
        // 獲取DBOptions
        MongoClientOptions.Builder build = new MongoClientOptions.Builder();
        build.connectionsPerHost(50); // 與目標資料庫能夠建立的最大connection數量為50
        build.threadsAllowedToBlockForConnectionMultiplier(50); // 如果當前所有的connection都在使用中,則每個connection上可以有50個執行緒排隊等待
        build.maxWaitTime(120000);
        build.connectTimeout(60000);
        MongoClientOptions myOptions = build.build();
        // 獲取ServerAddress
        ServerAddress addr = new ServerAddress();
        String hosts = "127.0.0.1:27017";
        for (String host : hosts.split("&")) {
            String ip = host.split(":")[0];
            String port = host.split(":")[1];
            addr = new ServerAddress(ip, Integer.parseInt(port));
        }
        // new Mongo例項
        MongoClient mongo = new MongoClient(addr, myOptions);
        // 第二:連線具體的資料庫
        // 其中引數是具體資料庫的名稱,若伺服器中不存在,會自動建立
        MongoDatabase db = mongo.getDatabase("war");
        // 第三:操作具體的表
        // 在mongodb中沒有表的概念,而是指集合
        // 其中引數是具體集合的名稱,若伺服器中不存在,會自動建立
        MongoCollection<Document> collection = db.getCollection("collect1");
        // 新增操作
        // 在mongodb中沒有行的概念,而是指文件
//        BasicDBObject 不推薦使用
        Document document = new Document("name", "mongo")
                .append("count", 1)
                .append("info", new Document("x", 100).append("y", 200));
        // 然後儲存到集合中
        collection.insertOne(document);
        // 第二種:直接把json存到資料庫中
        String jsonTest = "{'id':1,'name':'小明',"
                + "'address':{'city':'beijing','code':'065000'}" + "}";
        document = Document.parse(jsonTest);
        collection.insertOne(document);
//        查詢操作
        System.out.println("find all");
        FindIterable<Document> documents = collection.find();
        for (Document d : documents) {
            System.out.println(d);
        }
        System.out.println("find condition");
        Document query = new Document("id", 1);
        documents=collection.find(query);
        for (Document d : documents) {
            System.out.println(d);
        }
    }

}

工具類封裝

Document 和 JavaBean 之間的相互轉換,藉助 Gson(Json)

import com.google.gson.Gson;
import org.bson.Document;

/**
 * Document 和 JavaBean 之間的相互轉換,中間藉助 Gson 作為兩者轉換的媒介
 *
 * @author ilala
 */
public class DocumentUtil {
    private static Gson gson = new Gson();
    /**
     * 把實體bean物件轉換成Document
     */
    public static <T> Document bean2Document(T bean) {
        if (bean == null) {
            return null;
        }
        // 使用Gson轉換javabean為json字串
        String json = new Gson().toJson(bean);
        // 使用Mongo提供的Json工具類轉為Document物件
        return Document.parse(json);
    }

    /**
     * 把Document轉換成bean物件
     */
    public static <T> T document2Bean(Document document, Class<T> clz) {
        if (document == null) {
            return null;
        }
        // 使用Gson把Document物件轉化為json字串
        String json = gson.toJson(document);
        // 使用Gson把Json字串轉換為Javabean
        T obj = gson.fromJson(json, clz);
        return obj;
    }

}

Mongo API 封裝

import com.mongodb.MongoClient;
import com.mongodb.MongoClientOptions;
import com.mongodb.ServerAddress;
import com.mongodb.client.*;
import com.mongodb.client.model.Filters;
import org.bson.Document;
import org.bson.conversions.Bson;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

public class MongoUtil {
    private MongoClient mongo = null;
    private MongoDatabase db = null;
    private static final Map<String, MongoUtil> instances = new ConcurrentHashMap<String, MongoUtil>();

    /**
     * 例項化
     *
     * @return MongoDBManager物件
     */
    static {
        getInstance("db");// 初始化預設的MongoDB資料庫
    }

    public static MongoUtil getInstance() {
        return getInstance("db");// 配置檔案預設資料庫字首為db
    }

    public static MongoUtil getInstance(String dbName) {
        MongoUtil mongoMgr = instances.get(dbName);
        if (mongoMgr == null) {
            mongoMgr = buildInstance(dbName);
            if (mongoMgr == null) {
                return null;
            }
            instances.put(dbName, mongoMgr);
        }
        return mongoMgr;
    }

    private static synchronized MongoUtil buildInstance(String dbName) {
        MongoUtil mongoMgr = new MongoUtil();
        try {
            mongoMgr.mongo = new MongoClient(getServerAddress(dbName), getDBOptions(dbName));
            mongoMgr.db = mongoMgr.mongo.getDatabase("war");
            System.out.println("connect to MongoDB success!");
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
        return mongoMgr;
    }

    /**
     * 獲取集合(表)
     *
     * @param collection
     */
    public MongoCollection<Document> getCollection(String collection) {
        return db.getCollection(collection);
    }

    /**
     * 插入
     *
     * @param collection
     * @param o
     */
    public void insert(String collection, Document o) {
        getCollection(collection).insertOne(o);
    }

    /**
     * 批量插入
     *
     * @param collection
     * @param list
     */
    public void insertBatch(String collection, List<Document> list) {
        if (list == null || list.isEmpty()) {
            return;
        }
        getCollection(collection).insertMany(list);
    }

    /**
     * 刪除
     *
     * @param collection
     * @param query
     */
    public List<Document> delete(String collection, Bson query) {
        List<Document> list = find(collection, query);
        getCollection(collection).deleteOne(query);
        return list;
    }

    /**
     * 批量刪除
     *
     * @param collection
     * @param list
     */
    public void deleteBatch(String collection, List<Bson> list) {
        if (list == null || list.isEmpty()) {
            return;
        }
        for (int i = 0; i < list.size(); i++) {
            // 批量條件刪除
            delete(collection, list.get(i));
        }
    }

    /**
     * 計算集合總條數
     *
     * @param collection
     */
    public long getCount(String collection) {
        long count = getCollection(collection).countDocuments();
        return count;
    }

    /**
     * 計算滿足條件條數
     *
     * @param collection
     * @param query
     */
    public long getCount(String collection, Bson query) {
        long count = getCollection(collection).countDocuments(query);
        return count;
    }

    /**
     * 更新
     *
     * @param collection
     * @param query      查詢條件
     * @param setFields  更新物件
     * @return List<Document> 更新後的物件列表
     */
    public List<Document> update(String collection, Bson query, Bson setFields) {
        List<Document> list = find(collection, query);
        getCollection(collection).updateMany(query, setFields);
        return list;
    }

    /**
     * @param collection
     * @param query
     * @param setFields
     * @return DBObject
     * @Title: updateOne
     * @Description: 更新一條資料
     */
    public Document updateOne(String collection, Bson query, Bson setFields) {
        Document document = getCollection(collection).findOneAndUpdate(query, setFields);
        return document;
    }

    /**
     * @param collection
     * @param id
     * @param setFields
     * @return DBObject
     * @Title: updateOne
     * @Description: 根據id更新一條資料
     */
    public Document updateOne(String collection, long id, Bson setFields) {
        return updateOne(collection, new Document("id", id), setFields);
    }

    private <T> List<T> toArray(MongoIterable<T> it) {
        if (it != null) {
            List<T> list = new ArrayList<>();
            for (T i : it) {
                list.add(i);
            }
            return list;
        } else {
            return null;
        }
    }

    /**
     * 查詢(返回一個List<Document>)
     *
     * @param collection
     * @param query      查詢條件
     */
    public List<Document> find(String collection, Bson query) {
        FindIterable<Document> documents = getCollection(collection).find(query);
        return toArray(documents);
    }

    /**
     * 查詢集合所有物件
     *
     * @param collection
     */
    public List<Document> findAll(String collection) {
        return find(collection, new Document());
    }

    /**
     * 按順序查詢集合所有物件
     *
     * @param collection 資料集
     * @param orderBy    排序
     */
    public List<Document> findAll(String collection, Bson orderBy) {
        FindIterable<Document> documents = getCollection(collection).find().sort(orderBy);
        return toArray(documents);
    }

    /**
     * distinct操作
     *
     * @param collection 集合
     * @param field      distinct欄位名稱
     */
    public List<String> distinct(String collection, String field) {
        DistinctIterable ret = getCollection(collection).distinct(field, String.class);
        return toArray(ret);
    }

    /**
     * distinct操作
     *
     * @param collection 集合
     * @param field      distinct欄位名稱
     * @param query      查詢條件
     */
    public List<String> distinct(String collection, String field, Bson query) {
        DistinctIterable ret = getCollection(collection).distinct(field, query, String.class);
        return toArray(ret);
    }

    /**
     * @param collection 集合
     * @param map        map javascript函式字串,如:function(){ for(var key in this) {
     *                   emit(key,{count:1}) } }
     * @param reduce     reduce Javascript函式字串,如:function(key,emits){ total=0; for(var
     *                   i in emits){ total+=emits[i].count; } return {count:total}; }
     * @param orderBy    排序
     */
    public List<Document> mapReduce(String collection, String map, String reduce, Bson orderBy) {
        MapReduceIterable ret = getCollection(collection).mapReduce(map, reduce).sort(orderBy);
        return toArray(ret);
    }

    /**
     * @param dbName
     * @return List<ServerAddress>
     * @Title: getServerAddress
     * @Description: 獲取資料庫伺服器列表
     */
    private static List<ServerAddress> getServerAddress(String dbName) {
        List<ServerAddress> list = new ArrayList<>();
        String hosts = "127.0.0.1:27017";
        for (String host : hosts.split("&")) {
            String ip = host.split(":")[0];
            String port = host.split(":")[1];
            list.add(new ServerAddress(ip, Integer.parseInt(port)));
        }
        return list;
    }

    /**
     * @return MongoClientOptions
     * @Title: getDBOptions
     * @Description: 獲取資料引數設定
     */
    private static MongoClientOptions getDBOptions(String dbName) {
        MongoClientOptions.Builder build = new MongoClientOptions.Builder();
        build.connectionsPerHost(50); // 與目標資料庫能夠建立的最大connection數量為50
        build.threadsAllowedToBlockForConnectionMultiplier(50); // 如果當前所有的connection都在使用中,則每個connection上可以有50個執行緒排隊等待
        build.maxWaitTime(120000);
        build.connectTimeout(60000);
        MongoClientOptions myOptions = build.build();
        return myOptions;
    }

    public static void main(String[] args) {
        System.out.println("=================insert==============");
        getInstance().insert(
                "user",
                new Document().append("name", "admin1")
                        .append("type", "13").append("score", 70)
                        .append("level", 2)
                        .append("inputTime", System.currentTimeMillis()));
        getInstance().insert(
                "user",
                new Document().append("name", "admin2")
                        .append("type", "2").append("score", 70)
                        .append("level", 6)
                        .append("inputTime", System.currentTimeMillis()));
        getInstance().insert(
                "user",
                new Document().append("name", "admin3")
                        .append("type", "2").append("score", 70)
                        .append("level", 2)
                        .append("inputTime", System.currentTimeMillis()));
        for (Document d : getInstance().findAll("user")) {
            System.out.println(d);
        }
        System.out.println("=================update==============");
        getInstance().update("user",
                Filters.eq("name", "admin1"),
                new Document("$set", new Document("name", "newAdmin")));
        for (Document d : getInstance().findAll("user")) {
            System.out.println(d);
        }
        System.out.println("=================distinct==============");
        for (String o : getInstance().distinct("user", "name")) {
            System.out.println(o);
        }
        System.out.println("=================delete==============");
        getInstance().delete("user", new Document("name", "admin1"));
        for (Document d : getInstance().findAll("user")) {
            System.out.println(d);
        }
        System.out.println("=================map reduce==============");
//        按照 type 分類,score 求和,level 求平均值,按 level 排序
        List<Document> list = getInstance().mapReduce(
                "user",
                "function(){emit({type:this.type},{type:this.type,score:this.score,level:this.level});}",
                "function(key,values){var result={type:key.type,score:0,level:0};var count=0;values.forEach(function(value){result.score+=value.score;result.level+=value.level;count++});result.level=result.level/count;return result;}",
                new Document("level", 1));
        for (Document d : list) {
            System.out.println(d);
        }
    }
}

教程連結

https://blog.csdn.net/mrhelicopter/article/category/7327531

http://www.runoob.com/mongodb/mongodb-java.html

Spring 也提供了對 MongoDB 的封裝