天天看點

mongodb基礎學習

Mongdb

mongdb入門

mongdb安裝

linux下安裝mangdb
wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-rhel62-3.2.10.tgz
           
  • 下載下傳完成後解壓
tar zxvf mongodb-linux-x86_64-rhel62-3.2.10.tgz
           
  • 安裝成功 安裝成功後的檔案結構目錄如下:
bin 
	mongo.exe
	mongo.pdb
	mongod.exe
	mongod.pdb
	mongodump.exe
	mongoexport.exe
	mongofiles.exe
	mongoimport.exe
	mongooplog.exe
	mongoperf.exe
	mongoperf.pdb
	mongorestore.exe
	mongos.exe
	mongos.pdb
	mongostat.exe
	mongotop.exe
GNU-AGPL-3.0
README
THIRD-PARTY-NOTICES
           

bin

檔案夾下是mongodb的各種工具元件,具體功能請檢視mongodb手冊

  • 進入

    /usr/local/mongod

    預設端口為27017
./mongod --path=/data/db
           
mongodb基礎學習
  • 浏覽器通路
mongodb基礎學習

mongodb常用啟動參數

mongod.exe

常用參數如下

參數 描述
--bind_ip 綁定服務IP,若綁定127.0.0.1,則隻能本機通路,不指定預設本地所有IP
--logpath 定MongoDB日志檔案,注意是指定檔案不是目錄
--logappend 使用追加的方式寫日志
--dbpath 指定資料庫路徑
--port 指定服務端口号,預設端口27017
--serviceName 指定服務名稱
--serviceDisplayName 指定服務名稱,有多個mongodb服務時執行。
--install 指定作為一個Windows服務安裝。

mongod.exe

的啟動參數,在window環境下和linux環境下并不相同,詳見mongod - mongodb啟動服務工具。

mongodb背景啟動

  • 配置環境變量

    export PATH=$PATH:/usr/local/mongodb-3.2.10/bin

  • 編寫mongodb配置檔案
#資料庫路徑
dbpath=/data/db/
#日志輸出檔案路徑
logpath=/data/log/mongod.log
#錯誤日志采用追加模式
logappend=true
#啟用日志檔案,預設啟用
journal=true
#這個選項可以過濾掉一些無用的日志資訊,若需要調試使用請設定為false
quiet=true
#端口号 預設為27017
port=27017
           
  • vim /etc/init.d/mongdb

#!/bin/sh  
# chkconfig: 2345 10 90 
# description: myservice ....
#  
#  ### BEGIN INIT INFO 
# Short-Description: mongodb    
# Description: mongo db server    
### END INIT INFO    

#注意這裡的路徑設定為你的mongod的位置
PROGRAM=/usr/local/mongodb-3.2.10/bin/mongod
MONGOPID=`ps -ef | grep 'mongod' | grep -v grep | awk '{print $2}'`

test -x $PROGRAM || exit 0

case "$1" in
  start)
     ulimit -n 3000
     echo "Starting MongoDB server"
#注意這裡的路徑設定為你的mongodb的配置檔案的位置
     $PROGRAM --fork --quiet -f /data/conf/mongod.conf
     echo "Started MongoDB server"
     ;;
  stop)
     echo "Stopping MongoDB server"
     if [ ! -z "$MONGOPID" ]; then
        kill -15 $MONGOPID
     fi
     echo "Stopped MongoDB server"
     ;;
  status)
     ;;
  *)
     echo "Usage: mongodb {start|stop|status}"
     exit 1
esac
exit 0
           
  • 儲存完畢後執行下面幾條指令
# chmod +x /etc/init.d/mongodb
# chkconfig --add mongodb
# chkconfig mongodb on
           
  • 然後啟動mongdb

    service mongodb start

啟動shell
  • 使用mongodb自帶的shell
mongodb基礎學習

mongodb資料增删

在mongodb中是通過資料庫、集合、文檔的方式來管理資料,下邊是mongodb與關系資料庫的一些概念對比:

mongodb基礎學習
建立資料庫
use DATABASE_NAME
           

如果資料庫不存在,則建立資料庫,否則切換到指定資料庫。

mongodb基礎學習
  • 檢視所有資料庫
show dbs
           
mongodb基礎學習

可以看到我們剛剛建立的資料庫并不在清單中 如果想要添加進去必須插入一些資料

db.mongodb_test.insert({'name':'zgrey'})
           
mongodb基礎學習
  • 再次檢視
mongodb基礎學習

MongoDB 中預設的資料庫為 test,如果你沒有建立新的資料庫,集合将存放在 test 資料庫中。

删除資料庫
db.dropDatabase()
           

删除目前資料庫,預設為 test,你可以使用 db 指令檢視目前資料庫名。

  • 首先檢視所有資料庫
mongodb基礎學習
  • 進入資料庫
mongodb基礎學習
  • db.dropDatabase()

mongodb基礎學習
  • 再次檢視資料庫
mongodb基礎學習
  • 集合删除的格式是

    db.collection.drop()

集合增删
  • 建立集合
db.createCollection(name, options)
name: 新建立的集合名稱
options: 建立參數
           
  • 删除集合
db.collection.drop()
例子:
db.student.drop() 删除student集合
           
Mongodb插入文檔
  1. 文檔的資料結構和JSON基本一樣。
  2. 所有存儲在集合中的資料都是BSON格式。
  3. BSON是一種類json的一種二進制形式的存儲格式,簡稱Binary JSON。
  • MongoDB 使用 insert() 或 save() 方法向集合中插入文檔,文法如下:
db.COLLECTION_NAME.insert(document)  
           
  • 以下文檔可以存儲在 MongoDB 的 mongo 資料庫 的 col集合中:
db.col.insert({title:'Mongodb_test',description:'Mongodb是一個Nosql資料庫',by:'zgrey',url:'www.zgrey.com',tags:['mongodb','test','zgrey'],likes:100})
           

以上執行個體中 col 是我們的集合名,前一章節我們已經建立過了,如果該集合不在該資料庫中, MongoDB 會自動建立該集合并插入文檔。

  • 檢視資料庫

    db.col.find()

mongodb基礎學習
  • 我們也可以将資料定義為一個變量,如下所示:
document=({title:'Mongodb_test',description:'Mongodb是一個Nosql資料庫',by:'zgrey',url:'www.zgrey.com',tags:['mongodb','test','zgrey'],likes:100})
           
mongodb基礎學習
  • 插入資料庫

    db.col.insert(document)

mongodb基礎學習

插入文檔你也可以使用

db.col.save(document)

指令。如果不指定 _id 字段 save() 方法類似于 insert() 方法。如果指定 _id 字段,則會更新該 _id 的資料。

Mongodb删除文檔

MongoDB remove()函數是用來移除集合中的資料。

MongoDB資料更新可以使用update()函數。在執行remove()函數前先執行find()指令來判斷執行的條件是否正确,這是一個比較好的習慣。

  • 删除文檔的基本文法
db.collection.remove( 
	<query>,     
	<justOne> 
)  
           

如果你的 MongoDB 是 2.6 版本以後的,文法格式如下:

db.collection.remove(     
	<query>,     
	{       
		justOne: <boolean>,
		writeConcern: <document> 
	} 
)
           

參數說明:

  • query :(可選)删除的文檔的條件。
  • justOne : (可選)如果設為 true 或 1,則隻删除一個文檔。
  • writeConcern :(可選)抛出異常的級别。

使用find()函數查詢資料

mongodb基礎學習
  • 接下來我們移除 title 為 'Mongodb_test' 的文檔:
db.col.remove({'title':'Mongodb_test'})
           
mongodb基礎學習

移除兩條資料

  • 再次檢視集合
mongodb基礎學習

如果你隻想删除第一條找到的記錄可以設定 justOne 為 1,如下所示:

  • 再次插入兩條新的資料
mongodb基礎學習
  • 測試上面的指令

    db.col.remove({title:'Mongodb_test'},1)

mongodb基礎學習
mongodb基礎學習
  • 如果你想删除所有資料,可以使用以下方式(類似正常 SQL 的 truncate 指令):
>db.col.remove({})  
>db.col.find()  
           
更新文檔

MongoDB 使用 update() 和 save() 方法來更新集合中的文檔。接下來讓我們詳細來看下兩個函數的應用及其差別。

  • update() 方法用于更新已存在的文檔。文法格式如下:
db.collection.update(    
	<query>, 
	<update>, 
	{       
		upsert: <boolean>,   
		multi: <boolean>,  
		writeConcern: <document>
	}
)
           
  • query : update的查詢條件,類似sql update查詢内where後面的。
  • update : update的對象和一些更新的操作符(如$,$inc...)等,也可以了解為sql update查詢内set後面的
  • upsert : 可選,這個參數的意思是,如果不存在update的記錄,是否插入objNew,true為插入,預設是false,不插入。
  • multi : 可選,mongodb 預設是false,隻更新找到的第一條記錄,如果這個參數為true,就把按條件查出來多條記錄全部更新。
  • writeConcern :可選,抛出異常的級别。

我們在集合 col 中插入如下資料:

mongodb基礎學習
  • 接着我們通過 update() 方法來更新标題(title):
db.col.update({'title':'Mongodb_test'},{$set:{'title':'Mongodb'}})
           
mongodb基礎學習
mongodb基礎學習

以上語句隻會修改第一條發現的文檔,如果你要修改多條相同的文檔,則需要設定 multi 參數為 true。

>db.col.update({'title':'MongoDB'},{$set:{'title':'MongoDB'}},{multi:true})
           
  • save方法

save() 方法通過傳入的文檔來替換已有文檔。文法格式如下:

db.collection.save(    
	<document>,     
	{      
		writeConcern: <document> 
	}  
)  
           
  • document : 文檔資料。

測試: 這裡我們替換id為

ObjectId("60822d2002162bf438740c6e")

的文檔

db.col.save({"_id" : ObjectId("60822d2002162bf438740c6e"),'title':'Mongodb','description':'Mongodb Nosql','by':'zgrey','url':'www.zgrey',"tags" : [ "mongodb", "test", "zgrey" ], "likes" :123})
           
mongodb基礎學習
  • 更多執行個體

隻更新第一條記錄:

db.col.update( { "count" : { $gt : 1 } } , { $set : { "test2" : "OK"} } );
           

全部更新:

db.col.update( { "count" : { $gt : 3 } } , { $set : { "test2" : "OK"} },false,true );
           

隻添加第一條:

db.col.update( { "count" : { $gt : 4 } } , { $set : { "test5" : "OK"} },true,false );
           

全部添加加進去:

db.col.update( { "count" : { $gt : 5 } } , { $set : { "test5" : "OK"} },true,true );
           
db.col.update( { "count" : { $gt : 15 } } , { $inc : { "count" : 1} },false,true );
           
db.col.update( { "count" : { $gt : 10 } } , { $inc : { "count" : 1} },false,false );
           

使用者操作

建立使用者

建立一個資料庫新使用者用db.createUser()方法,如果使用者存在則傳回一個使用者重複錯誤。

db.createUser(user, writeConcern)
           
  • user:這個文檔建立關于使用者的身份認證和通路資訊;
  • writeConcern:這個文檔描述保證MongoDB提供寫操作的成功報告。

User文檔

user文檔,定義了使用者的以下形式:

{ user: "<name>",
  pwd: "<cleartext password>",
  customData: { <any information> },
  roles: [
    { role: "<role>", db: "<database>" } | "<role>",
    ...
  ]
}
           

user文檔字段介紹:

  • user字段,為新使用者的名字;
  • pwd字段,使用者的密碼;
  • cusomData字段,為任意内容,例如可以為使用者全名介紹;
  • roles字段,指定使用者的角色,可以用一個空數組給新使用者設定空角色;

在roles字段,可以指定内置角色和使用者定義的角色。

MongoDB内置角色有如下:

  1. 資料庫使用者角色:read、readWrite;
  2. 資料庫管理角色:dbAdmin、dbOwner、userAdmin;
  3. 叢集管理角色:clusterAdmin、clusterManager、clusterMonitor、hostManager;
  4. 備份恢複角色:backup、restore;
  5. 所有資料庫角色:readAnyDatabase、readWriteAnyDatabase、userAdminAnyDatabase、dbAdminAnyDatabase
  6. 超級使用者角色:root

    // 這裡還有幾個角色間接或直接提供了系統超級使用者的通路(dbOwner 、userAdmin、userAdminAnyDatabase)

  7. 内部角色:__system

你可以點選這裡檢視每個角色所擁有的操作權限。

writeConcern文檔

  • w選項:允許的值分别是 1、0、大于1的值、"majority"、;
  • j選項:確定mongod執行個體寫資料到磁盤上的journal(日志),這可以確定mongd以外關閉不會丢失資料。設定true啟用。
  • wtimeout:指定一個時間限制,以毫秒為機關。wtimeout隻适用于w值大于1。

示例

例如:在products資料庫建立使用者accountAdmin01,并給該使用者admin資料庫上clusterAdmin和readAnyDatabase的角色,products資料庫上readWrite角色。

use products
db.createUser( { "user" : "zgrey",
                 "pwd": "123",
                 "customData" : { employeeId: 12345 },
                 "roles" : [ { role: "clusterAdmin", db: "admin" },
                             { role: "readAnyDatabase", db: "admin" },
                             "readWrite"
                             ] },
               { w: "majority" , wtimeout: 5000 } )
           
mongodb基礎學習
  • 測試

    mongo -u zgrey -p 123 --authenticationDatabase products

mongodb基礎學習
查詢使用者

show users

mongodb基礎學習
删除使用者
  • 格式

    db.dropUser("使用者名")

mongodb基礎學習
修改使用者
mongodb基礎學習
  • 先建立一個使用者 在products資料庫下
use products
db.createUser( { "user" : "zgrey",
                 "pwd": "123",
                 "customData" : { employeeId: 12345 },
                 "roles" : [ { role: "clusterAdmin", db: "admin" },
                             { role: "readAnyDatabase", db: "admin" },
                             "readWrite"
                             ] },
               { w: "majority" , wtimeout: 5000 } )
           
  • 修改使用者的角色

    db.updateUser('zgrey',{'roles':[{'role':'clusterAdmin','db':'admin'}]})

mongodb基礎學習
修改密碼
  • 修改zgrey使用者密碼為789

    db.changeUserPassword('zgrey','789')

  • mongo -uzgrey -p789 --authenticationDatabase products

mongodb基礎學習

java代碼連接配接mongodb

<dependency>
            <groupId>org.mongodb</groupId>
            <artifactId>mongo-java-driver</artifactId>
            <version>3.2.1</version>
        </dependency>
           
  • 編寫測試類
@Test
    public void connect(){
        MongoClient mongoClient = new MongoClient("192.168.207.139",27017);
        //也可以使用字元串進行連接配接
//        MongoClientURI clientURI = new MongoClientURI("mongodb://192.168.207.139:27017");
//        MongoClient mongoClient = new MongoClient(clientURI);
        MongoDatabase products = mongoClient.getDatabase("mongodb");
        MongoCollection<Document> col = products.getCollection("col");
        Document first = col.find().first();
        String s = first.toJson();
        System.out.println(s);
    }