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 的封裝