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);
}
}
