MongoDB存儲基礎教程


一、MongoDB簡介

  1. mangodb是一種基於分布式、文件存儲的非關系型數據庫
  2. C++寫的,性能高
  3. 為web應用提供可擴展的高性能數據存儲解決方案
  4. 所支持的格式是json格式

二、MongoDB三元素&和關系型數據庫的區別

  三元素:數據庫  集合(類似關系型數據庫的表)  文檔(類似關系型數據庫中的行)

  文檔:就是一個對象,由鍵值對構成{"name":"zhangsan","age":33}

  集合:類似於數據庫中的表,儲存多個文檔,結構不固定
    {"name":"zhangsan","age":33}
    {"name":"zhangsan","age":33}
    {"book":"python","price":33}
  數據庫:是一個集合的物理容器,一個數據庫可以包含多個文檔

 

SQL術語/概念 MongoDB術語/概念 解釋/說明
database database 數據庫
table collection 數據庫表/集合
row document 數據記錄行/文檔
column field 數據字段/域
index index 索引
table joins   表連接,MongoDB不支持
primary key primary key 主鍵,MongoDB自動將_id字段設置為主鍵

三、MongoDB自帶的數據庫

admin: 從權限的角度來看,這是"root"數據庫。要是將一個用戶添加到這個數據庫,這個用戶自動繼承所有數據庫的權限。
local: 這個數據永遠不會被復制,可以用來存儲限於本地單台服務器的任意集合
config: 當Mongo用於分片設置時,config數據庫在內部使用,用於保存分片的相關信息。
test:MongoDB的默認數據庫是test。 如果沒有創建任何數據庫,那么集合將被保存在測試數據庫。

四、MongoDB數據庫命令

  mongod 開啟服務器
  mongo 開啟客戶端


  show dbs 顯示所有數據庫列表
  db 顯示當前數據庫對象/集合
  use 連接到一個指定的數據庫;如果數據庫不存在,會被創建。
  db.dropDatabase() 刪除選定的數據庫

  注意:show dbs要顯示數據庫,需要插入一個文檔進去。

五、集合(表)的創建

  MongoDB中使用db.createCollection(name,option)用來創建集合
    name 是要創建集合的名稱。
    option 用於指定集合的配置,(可選)指定有關內存大小和索引選項

  db.createCollection("myconllection") 創建集合
  show collections 檢查創建的集合
  db.COLLECTION_NAME.drop() 刪除集合 : db.myconllection.drop()

  在MongoDB中可以不創建集合,當插入一些文檔的時候MongoDB會自動創建集合。

六、文檔(一行記錄)

  文檔是一組鍵值對。MongoDB不需要設置相同的字段,並且相同的字段不需要相同的數據類型,這與關系型數據庫有很大區別,也是MongoDB的特點。

  文檔中的鍵/值對是有序的。
  文檔中的值不僅可以是在雙引號里面的字符串,還可以是其他幾種數據類型(甚至可以是整個嵌入的文檔)。
  MongoDB區分類型和大小寫。
  MongoDB的文檔不能有重復的鍵。
  文檔的鍵是字符串。除了少數例外情況,鍵可以使用任意UTF-8字符。

七、MongoDB中的數據類型

數據類型 描述
String 字符串。存儲數據常用的數據類型。在 MongoDB 中,UTF-8 編碼的字符串才是合法的。
Integer 整型數值。用於存儲數值。根據你所采用的服務器,可分為 32 位或 64 位。
Boolean 布爾值。用於存儲布爾值(真/假)。
Double 雙精度浮點值。用於存儲浮點值。
Min/Max keys 將一個值與 BSON(二進制的 JSON)元素的最低值和最高值相對比。
Array 用於將數組或列表或多個值存儲為一個鍵。
Timestamp 時間戳。記錄文檔修改或添加的具體時間。
Object 用於內嵌文檔。
Null 用於創建空值。
Symbol 符號。該數據類型基本上等同於字符串類型,但不同的是,它一般用於采用特殊符號類型的語言。
Date 日期時間。用 UNIX 時間格式來存儲當前日期或時間。你可以指定自己的日期時間:創建 Date 對象,傳入年月日信息。
Object ID 對象 ID。用於創建文檔的 ID。
Binary Data 二進制數據。用於存儲二進制數據。
Code 代碼類型。用於在文檔中存儲 JavaScript 代碼。
Regular expression 正則表達式類型。用於存儲正則表達式。

八、文檔的插入

MongoDB中使用insert()和save()方法向集合中插入文檔,語法如下:

db.collection_name.insert()

db.mycol.insert({
       _id: 1,
       title: 'MongoDB Overview',
       description: 'MongoDB is no sql database',
       by: 'weiheng',
       url: 'http://www.weiheng.site',
       tags: ['mongodb', 'database', 'NoSQL'],
       likes: 1,
 })

如果不指定_id參數,那么 MongoDB 會為此文檔分配一個唯一的ObjectId。

ObjectId的生成規則:

_id: ObjectId(4 bytes timestamp, 3 bytes machine id, 2 bytes process id, 3 bytes incrementer)

要在集合中插入多個文檔,可以在insert()命令中傳遞文檔數組:

db.mycollection.insert([
        {
            "_id":2,
            "title":"MongoDB Overview",
            "descrption":"MongoDB is no sql database",
            "by":"weiheng",
            "url":"http://www.weiheng.site",
            "likes":1,
        },
        {
            "_id":3,
            "title":"MongoDB Overview",
            "descrption":"MongoDB is no sql database",
            "by":"weiheng",
            "url":"http://www.weiheng.site",
            "likes":1,
        },
    ])

db.collection_name.insertOne()

將單個文檔插入集合中,該方法返回包含新插入文檔的_id.

db.inventory.insertOne(
       {
        item: "canvas",
        qty: 100,
        tags: ["cotton"],
        size: { h: 28, w: 35.5, uom: "cm"}
        }
)

返回結果

db.inventory.insertOne(
    ...    { item: "canvas", qty: 100, tags: ["cotton"], size: { h: 28, w: 35.5, uom: "cm" } }
    ... )
    {
            "acknowledged" : true,
            "insertedId" : ObjectId("5955220846be576f199feb55")
 }

db.collection_name.insertMany()

方法將多個文檔插入到集合中,可將一系列文檔傳遞給它。insertMany()返回包含新插入的文檔_id字段值的文檔。

db.inventory.insertMany([
       { item: "journal", qty: 25, tags: ["blank", "red"], size: { h: 14, w: 21, uom: "cm" } },
       { item: "mat", qty: 85, tags: ["gray"], size: { h: 27.9, w: 35.5, uom: "cm" } },
       { item: "mousepad", qty: 25, tags: ["gel", "blue"], size: { h: 19, w: 22.85, uom: "cm" } }
    ])

返回結果

db.inventory.insertMany([
... { item: "journal", qty: 25, tags: ["blank", "red"], size: { h: 14, w: 21, uom: "cm" } },
... { item: "mat", qty: 85, tags: ["gray"], size: { h: 27.9, w: 35.5, uom: "cm" } },
... { item: "mousepad", qty: 25, tags: ["gel", "blue"], size: { h: 19, w: 22.85, uom: "cm" } }
... ])
{
"acknowledged" : true,
"insertedIds" : [
ObjectId("59552c1c46be576f199feb56"),
ObjectId("59552c1c46be576f199feb57"),
ObjectId("59552c1c46be576f199feb58")
]
}

九、MongoDB文檔的查詢

要從MongoDB集合中查詢數據,需要使用MongoDB的find()方法

find()命令基本語法:

db.collection_name.find(document)

find()會以非結構化的方式顯示所有文檔內容:

{ "_id" : ObjectId("5b5eb4d81cec3f1204a88699"), "id" : 1, "title" : "MongoDB Overview", "descrption" : "MongoDB is no sql database", "by" : "weiheng", "url" : "http://www.weiheng.site", "likes" : 1 }
    { "_id" : 2, "title" : "MongoDB Overview", "descrption" : "MongoDB is no sql database", "by" : "weiheng", "url" : "http://www.weiheng.site", "likes" : 1 }
    { "_id" : 3, "title" : "MongoDB Overview", "descrption" : "MongoDB is no sql database", "by" : "weiheng", "url" : "http://www.weiheng.site", "likes" : 1 }
    { "_id" : 4, "title" : "MongoDB Overview", "descrption" : "MongoDB is no sql database", "by" : "weiheng", "url" : "http://www.weiheng.site", "likes" : 1 }

pretty():格式化數據並顯示結果:

db.collection_name.find().pretty()
        {
            "_id" : ObjectId("5b5eb4d81cec3f1204a88699"),
            "id" : 1,
            "title" : "MongoDB Overview",
            "descrption" : "MongoDB is no sql database",
            "by" : "weiheng",
            "url" : "http://www.weiheng.site",
            "likes" : 1
        }

除了find()還有findOne()它只會返回一個文檔;默認返回第一個:

findOne()語法:

db.collenction_name.findOne()

十、條件操作&比較運算符

操作            語法                            示例                                                RDBMS等效語句
相等            {<key>:<value>}                db.mycol.find({"by":"weiheng"}).pretty()        where by = 'weiheng'
小於            {<key>:{$lt:<value>}}        db.mycol.find({"likes":{$lt:50}}).pretty()        where likes < 50
小於等於         {<key>:{$lte:<value>}}        db.mycol.find({"likes":{$lte:50}}).pretty()        where likes <= 50
大於            {<key>:{$gt:<value>}}        db.mycol.find({"likes":{$gt:50}}).pretty()        where likes > 50
大於等於        {<key>:{$gte:<value>}}        db.mycol.find({"likes":{$gte:50}}).pretty()        where likes >= 50
不等於          {<key>:{$ne:<value>}}        db.mycol.find({"likes":{$ne:50}}).pretty()        where likes != 50

(1) 在find()中,如果將條件以,分割,則MongoDB將其視為AND操作

db.mycol.find({$and: [{key1: value1}, {key2:value2}]})
    # by為weiheng,title為MongoDB Overview的文章
    db.mycollection.findOne({
        $and:[
        {"by":"weiheng"},
        {"title":"MongoDB Overview"}
        ]
    })

(2) MongoDB中的OR操作符。基本語法和AND相同

db.mycol.find({$or: [{key1: value1}, {key2:value2}]})
    db.mycollection.findOne({
        $or:[
        {"by":"weiheng"},
        {"title":"MongoDB Overview"}
        ]
    })

(3) AND和OR

db.mycol.find({key:value,$or: [{key1: value1}, {key2:value2}]})

 十一、update()更新操作

MongoDB中使用Update將集合中的文檔進行更新,update()方法更新現有文檔中的值,而save()方法使用save()方法中傳遞的文檔數據替換現有文檔。

update語法:

db.COLLECTION_NAME.update(SELECTION_CRITERIA, UPDATED_DATA)

示例:修改id為1的title

// 查看id:1的信息
db.mycollection.find({'id':1})

{ "_id" : ObjectId("5b5eb4d81cec3f1204a88699"), "id" : 1, "title" : "MongoDB Overview", "descrption" : "MongoDB is no sql database", "by" : "weiheng", "url" : "http://www.weiheng.site", "likes" : 1 }

// 修改一下title為MongoDB
 db.mycollection.update({'id':1},{"$set":{"title":"MongoDB"}})
// 再次查詢
db.mycollection.find({'id':1})


{ "_id" : ObjectId("5b5eb4d81cec3f1204a88699"), "id" : 1, "title" : "MongoDB", "descrption" : "MongoDB is no sql database", "by" : "weiheng", "url" : "http://www.weiheng.site", "likes" : 1 }

 

十二、remove() & deleteOne() & deleteMany() 刪除操作

MongoDB中的 remove()方法用於從集合中刪除文檔。(官方不推薦使用remove(),推薦deleteOne和deleteMany())

remove()方法的基本語法如下:

db.COLLECTION_NAME.remove(DELLETION_CRITTERIA)

示例: 刪除id為1的數據

// 以下示例將刪除_id為“100”的文檔。
db.mycollection.remove({'id':1})

官方推薦使用 deleteOne() 和 deleteMany() 方法:

db.inventory.deleteMany({title: "MongoDB" })
db.inventory.deleteOne({title: "MongoDB" })

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM