MongoDB是一款NoSql數據庫。NoSql數據庫叫非關係型數據庫,NoSql的全名Not only sql。是爲了解決高併發、高可用、高可擴展,以及大數據存儲等一系列問題而產生的數據庫解決方案。NoSql,它不能替代關係型數據庫,只能作爲關係型數據庫的一個良好補充。
NoSql數據庫又分爲多種,如鍵值(Key-Value)存儲數據庫(如redis),列存儲數據庫(如HBase),文檔型數據庫(如MongoDB),圖形(Graph)數據庫等。
MongoDB作爲文檔型數據庫,其典型應用是Web應用(與Key-Value類似,Value是結構化的),它的數據模型是 一系列鍵值對。MongoDB的優勢是數據結構要求不嚴格,操作靈活;劣勢是查詢性能不高,而且缺乏統一的查詢語法。
當前,我們以win7系統爲例,64位win7安裝MongoDB相對簡單,因爲MongoDB官網在community server版本(https://www.mongodb.com/download-center#community)中僅推薦了一款64位的MongoDB,在安裝方面,網上也提供了不少帖子,相信大家都能順利安裝好。
相比較而言,32位的win7系統在安裝MongoDB時就要繁瑣很多。那麼,對於使用32位win7系統的朋友而言,應該如何安裝MongoDB,以及使用呢?
第一步:
首先,在這個網址中https://www.mongodb.org/dl/win32/i386下載後綴爲msi的MongoDB,此處以v3.2.19版本爲例。
下載了MongoDB後,雙擊運行即可進入安裝;在安裝過程中,可以選擇程序安裝路徑。在此,我將程序安裝路徑改爲E:\mongodb2。
MongoDB安裝好後,在E:\mongodb2下會生成一個bin目錄,bin目錄是可執行文件目錄,啓動mongo的服務器端以及客戶端都在這裏;同時,我們還要在E:\mongodb2下新建三個目錄:conf爲配置文件存放目錄;data爲數據存放目錄;log爲日誌存放目錄。如下所示:
接着,在conf下創建一個名稱爲mongod.conf的配置文件,裏面內容如下:
port=6699
dbpath=E:\mongodb2\data
logpath=E:\mongodb2\log\mongod.log
配置文件裏配置了MongoDB服務開啓後的端口,數據文件目錄,日誌存放目錄。爲mongod.conf的常見基本配置參數釋義(本文簡單演示,僅配置上面三項即可):
#數據庫數據存放目錄
dbpath=../data
#數據庫日誌存放目錄
logpath=../logs/mongod.log
#以追加的方式記錄日誌
logappend = true
#端口號 默認爲27017
port=6699
#以後臺方式運行進程
fork=true
#開啓用戶認證
auth=true
#關閉http接口,默認關閉http端口訪問
nohttpinterface=true
#mongodb所綁定的ip地址
bind_ip = 127.0.0.1
#啓用日誌文件,默認啓用
journal=true
#這個選項可以過濾掉一些無用的日誌信息,若需要調試使用請設置爲false
quiet=true
同時,在log目錄下創建名稱爲mongod.log的文件,裏面內容可以爲空,在MongoDB服務啓動後,這個日誌文件裏會記錄服務運行情況。
第二步:
接下來,將MongoDB安裝爲Windows服務,這步很關鍵。先是切換到bin目錄下,然後打開DOS窗口,執行如下命令:
E:\mongodb2\bin>mongod --dbpath "E:\mongodb2\data" --logpath "E:\mongodb2\log\mongod.log" --install --serviceName "MongoDB" --journal
這時,查看win7計算機管理的服務列表,可以看到名稱爲MongoDB的Windows服務已經在裏面。
第三步:
我們可以Windows的服務列表窗口裏開啓MongoDB服務,也可以在DOS窗口裏啓動MongoDB服務:
net start MongoDB
這時,計算機的服務列表裏顯示MongoDB服務已經開啓。我們還可以點擊MongoDB的啓動類型,將其設置爲手動。如下所示:
其實,我們在進行完“第二步”後,不必再進行第三步(第三步主要是爲了演示Windows服務的啓動,此處可以忽略),直接通過一個批處理文件配置MongoDB的端口(如果MongoDB沒有安裝在本地,需要在配置文件mongod.conf里加上"bind_id=ip地址")等信息,然後啓動MongoDB服務;接着,再通過一個批處理文件啓動操作MongoDB的客戶端即可。這就是我們下面要講述的內容。
爲了以後啓動MongoDB服務,以及使用MongoDB服務更方便,我們還可以製作兩個批處理文件。一個名稱爲“啓動MongoDB服務端.bat”,內容如下:
E:
cd E:\mongodb2\bin
mongod -f E:\mongodb2\conf\mongod.conf --journal
pause
另一個是啓動MongoDB客戶端,從而操作MongoDB。這個批處理文件名稱爲“啓動MongoDB客戶端.bat”,內容如下:
E:
cd E:\mongodb2\bin
mongo 127.0.0.1:6699/test
pause
接着,雙擊“啓動MongoDB服務端.bat文件,啓動成功後顯示如下:
這時,在瀏覽器地址欄裏輸入http://localhost:6699,顯示如下:
這說明MongoDB服務已經設置和開啓成功。接下來,啓動MongoDB客戶端,操作MongoDB。
雙擊“啓動MongoDB客戶端.bat”批處理文件,顯示如下:
說明MongoDB客戶端啓動成功。
到此,MongoDB安裝完畢,客戶端也啓動完畢,我們接下來操作MongoDB。
MongoDB有這些基本操作命令,我們瞭解下:
(1)查詢數據庫結構:
#查看現有數據庫
> show dbs
local 0.078GB
#使用某個數據庫;沒有就創建並使用
> use yc
switched to db yc
#插入數據
> db.yc.insert({"_id":1001,"name":"lzy","sex":"男"})
WriteResult({ "nInserted" : 1 })
#插入指定數據庫下的所有數據
> db.yc.find()
{ "_id" : 1001, "name" : "lzy", "sex" : "男" }
#更新數據
> db.yc.update({"_id":1001},{"name":"nlz","sex":"女"})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.yc.find()
{ "_id" : 1001, "name" : "nlz", "sex" : "女" }
#刪除數據
> db.yc.remove({"_id":1001})
WriteResult({ "nRemoved" : 1 })
> db.yc.find()
#創建數據集合
> db.createCollection("colA",{autoIndexId:true})
{
"note" : "the autoIndexId option is deprecated and will be removed i
"ok" : 1
}
> db.colA.insert({"_id":1001,"name":"張三"})
WriteResult({ "nInserted" : 1 })
> for(i=1;i<=10;i++) db.colA.insert(data:i)
2018-04-29T00:53:17.887+0800 E QUERY [thread1] SyntaxError: missing ) aft
#批量插入數據
> for(i=1;i<=10;i++) db.colA.insert({data:i})
WriteResult({ "nInserted" : 1 })
> db.colA.find()
{ "_id" : 1001, "name" : "張三" }
{ "_id" : ObjectId("5ae4a71301b5efddc588c80a"), "data" : 1 }
{ "_id" : ObjectId("5ae4a71301b5efddc588c80b"), "data" : 2 }
{ "_id" : ObjectId("5ae4a71301b5efddc588c80c"), "data" : 3 }
{ "_id" : ObjectId("5ae4a71301b5efddc588c80d"), "data" : 4 }
{ "_id" : ObjectId("5ae4a71301b5efddc588c80e"), "data" : 5 }
{ "_id" : ObjectId("5ae4a71301b5efddc588c80f"), "data" : 6 }
{ "_id" : ObjectId("5ae4a71301b5efddc588c810"), "data" : 7 }
{ "_id" : ObjectId("5ae4a71301b5efddc588c811"), "data" : 8 }
{ "_id" : ObjectId("5ae4a71301b5efddc588c812"), "data" : 9 }
{ "_id" : ObjectId("5ae4a71301b5efddc588c813"), "data" : 10 }
#修改數據集合裏某個數據的值
> db.colA.update({"name":"張三"},{"name":"李四"})
上面是MongoDB的一些基本操作指令。通過上述操作,我們可以觀察出一個特點,那就是:MongoDB存儲數據是以json格式進行的(如:({"key":"value,..."}))。
接下來,我們再看在Java程序中如何操作MongoDB。
我們以idea這款IDE工具爲例,創建一個工程,然後在工程裏添加MongoDB與單元測試的依賴(這是因爲我們要用單元測試展開測試),如下圖:
接下來,測試連接MongoDB服務(TestConnection2.java):
package com.itszt;
import com.mongodb.MongoClient;
import com.mongodb.client.MongoDatabase;
import org.junit.Test;
/**
* 測試連接MongoDB
*/
public class TestConnection2 {
@Test
public void testConnMongo(){
//連接到MongoDB服務
MongoClient mongoClient=new MongoClient("127.0.0.1",6699);
//連接到MongoDB數據庫
MongoDatabase mongoDatabase = mongoClient.getDatabase("test");
System.out.println("mongoDatabase = " + mongoDatabase);
System.out.println("MongoDB connect successfully");
//關閉MongoDB服務
mongoClient.close();
}
}
控制檯打印如下(顯示正常):
mongoDatabase = com.mongodb.MongoDatabaseImpl@150efb8
MongoDB connect successfully
接下來,我們再通過java程序操作MongoDB(TestCURD2.java):
package com.itszt;
import com.mongodb.BasicDBObject;
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.model.CreateCollectionOptions;
import org.bson.Document;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import java.util.ArrayList;
import java.util.regex.Pattern;
/**
* 測試MongoDB的數據操作
*/
public class TestCURD2 {
private MongoClient mongoClient;
private MongoDatabase mongoDatabase;
@Before
public void init() {
mongoClient = new MongoClient("127.0.0.1", 6699);
mongoDatabase = mongoClient.getDatabase("test");
System.out.println("MongoDB connect successfully");
}
@After
public void close() {
mongoClient.close();
}
@Test
public void testCollection() {
CreateCollectionOptions collectionOptions = new CreateCollectionOptions();
collectionOptions.autoIndex(true);
/*
capped爲true,表示起用封閉的集合,集合容量有固定上限,
集合超過上限時會自動覆蓋其最舊的目錄
如果capped爲true,則必須指定size參數
sizeInBytes()表示集合字節大小
*/
/*collectionOptions.capped(true);
collectionOptions.sizeInBytes(1024*1024*100);*/
//設置集合中文檔個數的上限
collectionOptions.maxDocuments(1000);
mongoDatabase.createCollection("colD", collectionOptions);
MongoCollection<Document> colD = mongoDatabase.getCollection("colD");
System.out.println("colD = " + colD);
}
//測試對於數據集合的添加
@Test
public void testInsert() {
MongoCollection<Document> colD = mongoDatabase.getCollection("colD");
ArrayList<Document> documents = new ArrayList<>();
for (int i = 1; i <= 10; i++) {
Document document = new Document();
document.append("userName", "張三-" + i);
document.append("userPwd", "admin_" + i);
documents.add(document);
}
//批量插入數據
colD.insertMany(documents);
//如果插入單條數據,則是:
//colD.insertOne(Docoment document);
}
//測試查詢數據集合
@Test
public void testFind(){
MongoCollection<Document> colD = mongoDatabase.getCollection("colD");
//正則條件
BasicDBObject basicDBObjectReg = new BasicDBObject();
Pattern pattern = Pattern.compile(".*[0]");
basicDBObjectReg.put("$regex",pattern);
//條件約束
BasicDBObject basicDBObject = new BasicDBObject();
basicDBObject.append("userName",basicDBObjectReg);
FindIterable<Document> documents = colD.find(basicDBObject);
MongoCursor<Document> iterator = documents.iterator();
Document document =null;
while (iterator.hasNext()){
document = iterator.next();
//取得整個數據
System.out.println("document = " + document);
//取得若干字段值
System.out.println(document.get("userName")+"-->"+document.get("userPwd"));
}
}
//測試對於數據集合的修改
@Test
public void testUpdate(){
MongoCollection<Document> colD = mongoDatabase.getCollection("colD");
BasicDBObject basicDBObjectOld = new BasicDBObject();
basicDBObjectOld.put("userName","李四");
BasicDBObject basicDBObjectNew = new BasicDBObject();
basicDBObjectNew.put("userName","王五");
BasicDBObject update = new BasicDBObject("$set", basicDBObjectNew);
colD.updateOne(basicDBObjectOld,update);
//批量修改
//colD.updateMany(basicDBObjectOld,update);
}
//測試對於數據集合的刪除
@Test
public void testDelete(){
MongoCollection<Document> colD = mongoDatabase.getCollection("colD");
//正則條件
BasicDBObject basicDBObjectReg = new BasicDBObject();
Pattern pattern = Pattern.compile("王.*");
basicDBObjectReg.put("$regex",pattern);
//條件約束
BasicDBObject basicDBObject = new BasicDBObject();
basicDBObject.append("userName",basicDBObjectReg);
colD.deleteOne(basicDBObject);
//批量刪除
// colD.deleteMany(basicDBObject);
}
}