mongodb想速成嗎,這個系列教程你能夠看看(1)

mongodb想速成嗎,這個系列教程你能夠看看(2)mongodb

一、mongodb簡介

  • MongoDB 是由C++語言編寫的,是一個基於分佈式文件存儲的開源數據庫系統。shell

  • 在高負載的狀況下,添加更多的節點,能夠保證服務器性能。數據庫

  • MongoDB 旨在爲WEB應用提供可擴展的高性能數據存儲解決方案。json

  • MongoDB 將數據存儲爲一個文檔,數據結構由鍵值(key=>value)對組成。MongoDB 文檔相似於 JSON 對象。字段值能夠包含其餘文檔,數組及文檔數組windows

二、mongodb下載地址

www.mongodb.com/download-ce… 選擇適合本身的版本。 數組

  • 須要注意的是,例如windows下,安裝完成須要把環境變量設置到你安裝mongodb文件夾的bin目錄下。
  • 好比我安裝mongodb到E:\mongodb因此bin目錄就是E:\mongodb\bin

三、mongodb 的適用場景和基本概念

3.1 MongoDB適用場景

  • 網站數據、緩存等大尺寸、低價值的數據緩存

  • 在高伸縮性的場景,用於對象及JSON數據的存儲。bash

3.2 MongoDB的基本概念

數據庫服務器

MongoDB的一個實例能夠擁有一個或多個相互獨立的數據庫,每一個數據庫都有本身的集合。數據結構

集合

集合能夠看做是擁有動態模式的表。

文檔

文檔是MongoDB中基本的數據單元,相似於RDB的行。文檔是鍵值對的一個有序集合。在JS中,文檔被表示成對象。

_id

每一個文檔都有個特殊的「_id」,在文檔所屬集合中是惟一的。

JavaScript shell

MongoDB自帶了一個功能強大的JavaScript Shell,能夠用於管理或操做MongoDB

舉例

  • 數據庫 MongoDB的單個實例能夠容納多個獨立的數據庫,好比一個學生管理系統就能夠對應一個數據庫實例
  • 集合 數據庫是由集合組成的,一個集合用來表示一個實體,如學生集合
  • 文檔 集合是由文檔組成的,一個文檔表示一條記錄,好比一位同窗張三就是一個文檔

四、添加和刪除服務

添加服務 在命令行工具裏

mongod.exe --dbpath E:\mongodata --logpath E:\mongolog --logappend --directoryperdb --serviceName mongodb --install
複製代碼
  • --dbpath 指定數據存放目錄
  • --logpath 日誌放在哪裏
  • --logappend 日誌寫入方式,能夠給老日誌加
  • --directoryperdb 將每一個數據庫單獨存放
  • --serviceName 起的服務名字叫
  • --install 安裝服務 下圖表示添加服務成功了

五、mongodb啓動與鏈接

啓動mongodb服務

mongod --dbpath=E:\Mongodb\data
複製代碼

若是出現waiting for connections on port 27017就表示啓動成功,已經在27017端口上監聽了客戶端的請求注:啓動說明

選項 含義
--port 指定服務端口號,默認端口27017
--logpath 指定MongoDB日誌文件,注意是指定文件不是目錄
--logappend 使用追加的方式寫日誌
--dbpath 指定數據庫路徑
--directoryperdb 設置每一個數據庫將被保存在一個單獨的目錄

接着,再打開一個新的命令行窗口,輸入

mongo 
複製代碼

就能夠連接到數據庫了

最後介紹一款mongodb可視化工具 Studio3T

studio3t.com/

六、數據庫操做

6.1 使用數據庫

use database_name 
// 例如咱們這裏能夠建一個叫school的數據庫
use school
複製代碼

database_name 表明數據庫的名字

注:若是此數據庫存在,則切換到此數據庫下,若是此數據庫還不存在也能夠切過來,可是並不能馬上建立數據庫 切換到 school數據庫下

6.2 查看全部數據庫

show dbs
複製代碼

備註: 咱們剛建立的數據庫school若是不在列表內, 要顯示它,咱們須要向school數據庫插入一些數據 db.students.insert({age:1});

inert數據以後

6.3 查看當前使用的數據庫

db
複製代碼

注:db表明的是當前數據庫 也就是school這個數據庫

6.4 刪除數據庫

db.dropDatabase()
複製代碼

school數據庫就沒了

七、集合操做

7.1 查看集合幫助

use demo
db.demo.help()
複製代碼

7.2 建立集合

7.2.1 建立一個空集合

db.createCollection(collection_Name) 
複製代碼

collection_Name集合的名稱

7.2.2 建立集合並插入一個文檔

collection_Name集合的名稱 document要插入的文檔

db.collection_Name.insert(document)
// 例如
db.demo.insert({age:1})
複製代碼

注:上圖裏的objectId是有規律的,規律以下

以前咱們使用MySQL等關係型數據庫時,主鍵都是設置成自增的。但在分佈式環境下,這種方法就不可行了,會產生衝突。爲此,MongoDB採用了一個稱之爲ObjectId的類型來作主鍵。ObjectId是一個12字節的 BSON 類型字符串。按照字節順序,一次表明:

- -
4字節: UNIX時間戳
3字節: 表示運行MongoDB的機器
2字節: 表示生成此_id的進程
3字節: 由一個隨機數開始的計數器生成的值

7.3 查看數據庫下的集合

show collections
複製代碼

7.4 查看當前集合

db.getName() 或者 db
複製代碼

7.5 刪除當前集合

db.dropDatabase()
複製代碼

8. 插入文檔

8.1 insert

db.collection_name.insert(document);
複製代碼

collection_name 集合的名字

document 插入的文檔

注:每當插入一條新文檔的時候mongodb會自動爲此文檔生成一個_id屬性,_id必定是惟一的,用來惟一標識一個文檔 _id也能夠直接指定,但若是數據庫中此集合下已經有此_id的話插入會失敗

db.demo.insert({_id:1,age:1});
複製代碼

8.2 save

db.collection_name.save(document)
複製代碼

collection_name 集合的名字 document 插入的文檔

注:若是不指定 _id 字段 save() 方法相似於 insert() 方法。若是指定 _id 字段,則會更新該 _id 的數據。 咱們save以前保存過的id=1的數據,看是否是更新了此條數據

db.demo.save({_id:1, age:2})
複製代碼

9. 更新文檔

db.collection.update(
   <query>,
   <updateObj>,
   {
     upsert: <boolean>,
     multi: <boolean>
   }
)
複製代碼
參數 -
query 查詢條件,指定要更新符合哪些條件的文檔
update 更新後的對象或指定一些更新的操做符
$set 在原基礎上累加
upsert 可選,這個參數的意思是,若是不存在符合條件的記錄時是否插入updateObj. 默認是false,不插入。
multi 可選,mongodb 默認只更新找到的第一條記錄,若是這個參數爲true,就更新全部符合條件的記錄。

9.1 更新文檔

db.demo.insert({name: 'zhangsan'});
db.demo.update({name:'zhangsan'},{age:12})
複製代碼

9.2 upsert

將students集合中數據中name是lisi的值修改成lisi,由於原表根本不存在name:lisi的,本來不會插入這一條數據,可是upsert選項設爲了true就插入成功了

db.demo.update({name:'lisi'}, {name:'lisi'}, {upsert:true});
複製代碼

9.3 multi

若是有多條age是1的數據只更新一條,若是想所有更新須要指定{multi:true}的參數

db.school.insert({age:1});
db.school.insert({age:1});
db.school.insert({age:1});
db.school.update({age:1}, {$set:{name:'lisi'}}, {multi:true});
db.school.find({})
複製代碼

十、更新操做符

10.1 $set

直接指定更新後的值

use c3;
db.c3.insert({name:'a'});
db.c3.update({name:'a'},{$set:{age:10}});
db.c3.find({})
複製代碼

10.2 $inc

在原基礎上累加

db.c3.update({name:'a'},{$inc:{age:1}});
複製代碼

10.3 $unset

刪除指定的鍵

db.c3.update({name:'2'},{$unset:{age:11}});
複製代碼

10.4 $push

向數組中添加元素

var result = db.student.update({name:'張三'},{
    $push:{"hobbys":"smoking"}
});
複製代碼

10.5 $ne

$ne相似於MYSQL的 not in 或者not exists

db.c3.update({hobbys:{$ne:"eating"}},{$push:{"hobbys":"sleeping"}});
複製代碼

10.6 $addToSet

向集合中添加元素

db.c3.update({a:1},{$addToSet:{"hobbys":"smoking"}});
複製代碼

10.7 $each

把數組中的元素逐個添加到集合中

db.a.insert({name:'a', hobbys:[1,2]});
db.a.update({name:'a'},{$addToSet:{hobbys:{$each:[3,4]}}});
db.a.find()
複製代碼

10.8 $pop

從數組中移除指定的索引中對應的元素

  • {$pop:{"key":1}}從數組末尾刪除一個與元素
  • {$pop:{"key":-1}}從數組開頭刪除一個與元素
db.c3.update({name:'a'},{$pop:{hobbys:1}});
db.c3.find()
複製代碼

10.9 修改指定索引元素

db.c3.update({name:'zfpx1'},{$set:{"hobbys.0":"smoking2"}});
複製代碼

十一、文檔的刪除

remove方法是用來移除集合中的數據

11.1 語法

db.collection.remove(
   <query>,
   {
     justOne: <boolean>
   }
)
複製代碼

11.2 參數

- -
query (可選)刪除的文檔的條件。
justOne (可選)若是設爲 true 或 1,則只刪除匹配到的多個文檔中的第一個

11.3 實例

刪除worker集合裏name是zfpx2的全部文檔數據

db.c3.remove({name:'a'});
複製代碼

即便匹配多條也只刪除一條

db.c3.remove({name:'a'},{justOne:true});
複製代碼

十二、查詢文檔

12.1 find

語法

db.collection_name.find()
複製代碼

參數

- -
collection_name 集合的名字

實例

查詢c3下全部的文檔

db.students.find()
複製代碼

12.2 查詢指定列

語法

db.collection_name.find({queryWhere},{key:1,key:1})
複製代碼

參數列表

- -
collection_name 集合的名字
queryWhere 參閱查詢條件操做符
key 指定要返回的列
1 表示要顯示

實例

只返回顯示age列

db.c3.insert([{name:1,age:2},{name:1,age:3},{name:1,age:4}]);
db.c3.find({},{_id:0, age:1});
複製代碼

12.3 findOne

查詢匹配結果的第一條數據 語法

db.collection_name.findOne()
複製代碼

實例

db.c3.findOne()`
複製代碼

12.4 $in

查詢字段在某個範圍內

db.c3.insert([{age:30, name:1},{age:100, name:2},{age:40, name:3},{age:60, name:4}])
db.c3.find({age:{$in:[30,100]}},{name:1,age:1});
複製代碼

12.5 $nin

查詢字段不在某個範圍內

db.c3.find({age:{$nin:[30,100]}},{name:1,age:1});
複製代碼

12.6 $not

對特定條件取反

db.c3.find({age:{$not:{$gte:20,$lte:30}}});
複製代碼

12.7 array

對數組的查詢

// 按全部元素匹配
 db.c3.find({friends:[ "A", "B", "C", "D" ]});
 
//匹配一項 包含A的就能夠
db.c3.find({friends:"A"});

// $all 必須同時包含A B
db.c3.find({friends:{$all:['A',"B"]}});

// $in 或者關係 ,包含A或者B
db.c3.find({friends:{$in:['A',"B"]}});
//$size 按數組的長度去匹配
db.c3.find({friends:{$size:4}});

//$slice 只返回數組中的某一部分
db.c3.find({friends:{$size:5}},{name:1,friends:{$slice:2}});
db.c3.find({friends:{$size:5}},{name:1,friends:{$slice:-2}});
$slice:["$array", [startIndex, ] length ] (startIndex能夠省略,默認從0開始)
db.c3.find({},{friends:{$slice:[0,3]}});
複製代碼

12.8 where

db.c3.find({$where:"this.age>30"},{name:1,age:1});
複製代碼

12.9 cursor

遊標不是查詢結果,而是查詢的一個返回資源或者接口,經過這個接口,能夠逐條讀取數據

var result = db.student.find();

while(result.hasNext()){
    printjson(result.next());
}
複製代碼

1三、條件操做符

條件操做符用於比較兩個表達式並從mongoDB集合中獲取數據

13.1 大於、大於等於、小於、小於等於操做符

參數

- -
$gt 大於
$gte 大於等於
$lt 小於
$lte 小於等於

13.2 使用 _id進行查詢

語法

db.collectoin_name.find({"_id" : ObjectId("value")})
複製代碼

查詢_id是 562af23062d5a57609133974 數據

db.stuc3dents.find({_id:ObjectId("5adb666ecd738e9771638985")}); 
複製代碼

13.8 查詢結果集的條數

語法

db.collectoin_name.find().count();
複製代碼
db.c3.find().count()
複製代碼

13.9 正則匹配

語法

db.collection.find({key:/value/})
複製代碼

參數

- -
collectoin_name 集合名稱
key 字段
value

查詢name裏包含joe的數據,正則只能匹配字符串

db.user.find({name:/joe/})
複製代碼

1四、與和或

14.1 and

find方法能夠傳入多個鍵(key),每一個鍵(key)以逗號隔開

語法

db.collection_name.find({key1:value1, key2:value2})
複製代碼

查詢name是1而且age是30的數據

db.students.find({name:1,age:30})
複製代碼

14.2 or

語法

db.collection_name.find(
   {
      $or: [
   {key1: value1}, {key2:value2}
      ]
   }
)
複製代碼

查詢age = 30 或者 age = 100 的數據

db.c3.find({$or:[{age:30},{age:100}]})
複製代碼

14.3 and和or聯用

語法

db.collection_name.find(
   {
     key1:value1,
     key2:value2,
     $or: [
   {key1: value1},
   {key2:value2}
     ]
   }

)
複製代碼

實例 查詢 age是30 而且 name是1或者 name是 3 的數據

db.c3.find({age: 30, $or:[{name:1},{age:3}]})
複製代碼

1五、分頁查詢

15.1 limit

讀取指定數量的數據記錄 語法

db.collectoin_name.find().limit(number)
複製代碼
var a = [];
for(var i = 0;i<10;i++){
    a.push({age:i})
};
db.c3.insert(a);
db.students.find().limit(3)
複製代碼

15.2 skip

跳過指定數量的數據,skip方法一樣接受一個數字參數做爲跳過的記錄條數 語法

db.collectoin_name.find().skip(number)
複製代碼
db.c3.find().skip(3)
複製代碼

15.3 skip+limit

一般用這種方式來實現分頁功能 語法

db.collectoin_name.find().skip(skipNum).limit(limitNum)
複製代碼
db.c3.find().skip(3).limit(3);
複製代碼

15.4 sort排序

sort()方法能夠經過參數指定排序的字段,並使用 1 和 -1 來指定排序的方式,其中 1 爲升序排列,而-1是用於降序排列。 語法

db.collectoin_name.find().sort({key:1})
db.collectoin_name.find().sort({key:-1})
複製代碼
db.c3
![](https://user-gold-cdn.xitu.io/2019/4/9/169fff28b40c6b57?w=502&h=220&f=jpeg&s=21589).find().sort({age:1})
複製代碼
相關文章
相關標籤/搜索