1. 程式人生 > 資料庫 >尚矽谷MongoDB學習筆記

尚矽谷MongoDB學習筆記

視訊連線:

筆記:

MongoDB

1.Database

  • 資料庫分類

    • 關係型資料庫(RDBMS)
      • MySQL, Oracle, DB2, SQL Server…
      • 該資料庫中全都是表
    • 非關係型資料庫(No SQL)
      • MongoDB, Redis…
      • 鍵值對資料庫
      • 文件資料庫MongoDB
  • MongoDB是為快速開發網際網路web應用而設計的資料庫系統

  • MongoDB的資料模型時面向文件的(BSON)

2.MongoDB

2.1.安裝MongoDB

  • 安裝

  • 配置環境

  • 在c盤根目錄建立data資料夾,在data中建立資料夾db

  • 執行mongodb

    • cmd:mongod //啟動mongodb伺服器,不要關閉
    • 另一個cmd:mongo //連線mongodb,出現>
  • 如果想更改檔案目錄(不在c盤下,但仍需data+db)

    • mongod --dbpath 檔案路徑\data\db [–port 123 //更改埠]
  • database

    • 伺服器:
      • 伺服器用來儲存資料
      • mongod 用來啟動伺服器
    • 客戶端:
      • 客戶端用來操作伺服器,對資料進行增刪查改的操作
      • mongo 用來啟動客戶端
  • 將mongodb設定為系統服務,可以自動在後臺啟動,不需要每次都手動啟動

    • 在C盤根目錄建立目錄data

      • mkdir c:\data\db
      • mkdir c:\data\log
    • 建立配置檔案

      • 在bin同目錄下新增一個配置檔案 mongod.cfg
    • 以管理員身份執行cmd

    • 執行如下命令

      • sc.exe create MongoDB binPath="\"D:\MongoDB\Server\4.0\bin\mongod.exe\" --service --config=\"D:\MongoDB\Server\4.0\mongod.cfg\"" DisplayName="MongoDB" start="auto"
        
  • 啟動mongodb服務

  • 如果啟動失敗,證明操作有誤

    • 在控制檯輸入 sc delete MongoDB 刪除之前的操作
    • 重新再來一次

2.2.基本概念

  • 資料庫
    • 是一個倉庫,可以存放集合
  • 集合
    • 類似於陣列,在集合中可以存放文件
  • 文件
    • 文件資料庫中最小單位,我們儲存和操作的內容都是文件
  • 在mongodb中,資料庫和集合都不需要手動建立,當建立文件時,如果文件所在的集合或資料庫不存在則會自動建立
  • 當一個文件的屬性值是一個文件時,內部的文件稱為 內嵌文件,mongoDB支援通過內嵌文件的屬性進行查詢,如果要查詢內嵌文件則可以通過.的形式來匹配,此時必須使用引號
    • eg: db.users.find({‘hobby.movies’:‘hero’})
  • 資料庫的方法能少調用盡量少呼叫,因為會降低效能

2.3.基本指令

  • 顯示當前所有資料庫:show dbs|databases
  • 進入到指定的資料庫中:use tes
  • 當前所處資料庫:db
  • 顯示資料庫中所有集合:show collections

2.4.資料庫的CRUD的操作

2.4.1資料庫中插入文件

  • db.collection_name.insert(doc)

    • 向集合中插入一個或多個文件

    • eg: 向test資料庫中,stus集合中插入一個新的學生物件

      {name: “www”, age: 18, gender: 男}

      db.stus.insert({name: “www”, age: 18, gender: “男”})

    • 當我們向集合中插入文件時,如果沒有給文件指定_id屬性,則資料庫自動為文件新增該屬性,該屬性用來作為文件唯一標識;如果自己 _id屬性,需要注意該屬性的唯一性

  • db.collection_name.insertOne()

    • 插入一個文件
  • db.collection_name.insertMany()

    • 插入多個文件

2.4.2資料庫中查詢文件

  • db.collection_name.find()

    • 查詢所有文件
    • 可以接受一個物件作為條件引數
    • find()返回一個數組
  • db.conllection_name.find(“hello”);

  • db.conllection_name.find(“hello”);

  • eg: db.stus.find({idb."hello})’

  • db.collection_name.findOne({{}});

  • db.conllection_name.find(“hello”).count()|length(); //f返回數量

2.4.3資料中更改文件

  • db.collection_name.update(查詢條件, 新物件)
    • update()預設情況下會自動使用新物件替換就舊物件
    • 如果需要指定屬性,而不是替換則需要使用修改操作符
      • $set:可以用來修改文件中的指定屬性
        • db.stuts.update(匹配條件, {$set: {修改屬性鍵值對}})
      • $unset: 刪除屬性,用法同set
      • $push: 用於向陣列中新增一個新的元素
      • $addToSet: 向陣列中新增一個新元素,如果陣列中已經存在了該元素則新增失敗
    • update()預設只會修改一個,可以更改multi屬性
  • db.collection_name.updateMany()
    • 同時修改多個符合條件的文件
  • db.collection_name.updateOne()
    • 修改一個符合條件的文件

2.4.4資料庫文件刪除

  • db.collection_name.remove()

    • remove可以根據條件刪除文件,傳遞條件的方式同find一樣
    • 預設會刪除符合條件的所有文件
    • 如果傳遞第二個引數,值為true,則只會刪除一個
    • 如果傳遞一個空物件,則會刪除所有文件,效能較差,此時可刪除集合:
      • db.collection_name.drop()
  • db.collection_name.deleteOne()

    • 刪除一個文件
  • db.collection_name.deleteMany()

    • 刪除多個文件
  • db.collection_name.drop() 刪除集合

  • db.dropDatabase() 刪除資料庫

  • 一般資料庫中的資料都不會刪除,所以刪除的方法很少呼叫

    一般會在資料中新增一個欄位,來表示資料是否被刪除

2.5.文件之間的關係

2.5.1 一對一

  • MongoDB中,可以通過內嵌文件的形式來體現出一對一的關係

  • db.wifeAndHusband.insert([
        {
            name: "huangrong",
            husband: {
                name: "guojing"
            }
         },
         {
         name: "panjinlian",
            husband: {
            name: "wudalang"
            }
         },
    ]);
    

2.5.2 一對多/多對一

  • 使用者 - 訂單

  • 對映

  • db.users.insert([
        {username: 'swk'},
        {username: 'zbj'}
    ]);
    
    db.order.insert({
        list: ['apple','banana'],
        user_id: ObjectId("5fc49a3d759231f39f683f4d")
    });
    
    

2.5.3 多對多

  • 分類 - 商品
  • 同為對映,把上列user_id改為陣列即可

2.6 補充內容

  • 排序
    • 查詢文件時,預設情況按_id值進行排序(升序)
    • sort() 可以用來指定文件排序的規則,需要傳遞一個物件指定排序規則(屬性名:1|-1)
    • limit skip sort 可以以任意的順序進行呼叫
  • 投影
    • 在查詢時,可以在第二個引數的位置來設定查詢結果的投影
    • {屬性名:0|1}

3.Mongoose

  • Mongoose是一個讓我們可以通過Node來操作mongoDB的模組

  • Mongoose是一個物件文件模型(ODM)

  • 好處

    • 可以為文件建立一個模式結構(Schema) - 約束
    • 可以對模型中的物件/文件進行驗證
    • 資料可以通過型別轉換為物件模型
    • 可以使用中介軟體來應用業務邏輯掛鉤
  • mongoose提供的新物件

    • Schema 模式物件
      • schema物件定義約束了資料庫中的文件結構
    • Model
      • Model物件作為集合中的所有文件的表示,相當於mongodb資料庫中的集合collection
    • Document
      • Document表示集合中的具體文件,相當於集合中的一個具體的文件
  • 使用

    • 下載安裝
      • npm i mongoose --save
    • 在專案中引入mongoose
      • var mongoose = require(“mongoose”)
    • 連線mongodb資料庫
      • mongoose.connect(‘mongodb://資料庫的ip地址:埠號/資料庫名’, {useMongoClient: true})
      • 如果埠號預設可以省略不寫
    • 斷開資料庫連線(一般不需要)
      • mongdb資料庫,一般情況下只需連線一次,之後除非專案停止伺服器關閉,否則連線一般不會斷開
      • mongoose.disconnect()
  • 監聽MongoDB資料庫的連線狀態

    • 在mongoose物件中,有一個屬性叫做connection,該物件表示的就是資料庫連線
    • 通過監視該物件的狀態,可以來監聽資料庫的連線與斷開
    • 資料庫連線成功的事件
      • mongoose.connection.once(“open”, function(){});
    • 資料庫斷開的事件
      • mongoose.connection.once(“close”, function(){});
  • 連線資料庫

    • 建立schema

        var mongoose = require('mongoose');
        var Schema = mongoose.Schema;
      
        var blogSchema = new Schema({
          title:  String,
          author: String,
          body:   String,
          comments: [{ body: String, date: Date }],
          date: { type: Date, default: Date.now },
          hidden: Boolean,
          meta: {
            votes: Number,
            favs:  Number
          }
        });
      
    • 通過schema建立model

      • model代表的是資料庫中的集合,通過model才能對資料庫進行操作
      • mongoose.model(modelName, schema);
        • modelName: 要對映的集合(mongoose會自動將集合變為複數)
        • schema: 約束
      • stuModel.create(doc, function(err){});
  • 有了model,就可以對資料庫進行增刪改查的操作了

model

  • 增加

    • Model.create(doc(s), [callback])
      • 用來建立一個或多個文件並新增到資料庫中
      • 引數:
        • doc(s) 可以是一個文件物件,也可以是一個文件物件的陣列
        • callback 當操作完成以後呼叫的回撥函式
  • 查詢

    • Model.find()

      • //直接獲取
        StuModel.find({name: "唐僧"}, function(err, docs){
            if(!err){
                console.log(docs);
            }
        });
        
        //投影獲取欄位
        StuModel.find({},{name:1, _id:0}, function(err, docs){
            if(!err){
                console.log(docs);
            }
        });
        
        //skip:跳過的數量    limit:顯示的數量
        StuModel.find({},"name age -_id",{skip: 3, limit: 1}, function(err, docs){
            if(!err){
                console.log(docs);
            }
        });
        
      • 通過find()查詢的結果,返回的物件,就是document,文件物件

      • document物件就是model的例項

    • Model.findById()

      • 通過id尋找
    • Model.findOne()

      • 只返回第一個
  • 修改

    • Model.update(conditions, doc[, options] [, callback])

    • Model.updateMany(conditions, doc[, options] [, callback])

    • Model.updateOne(conditions, doc[, options] [, callback])

      • 引數:
        • conditions 查詢條件
        • doc 修改後的物件
        • options 配置引數
        • callback 回撥函式
    • StuModel.updateOne({name:"唐僧"},{$set:{age:20}}, function(err){});
      
  • 刪除

    • Model.remove(conditions [, callback])

    • Model.deleteOne(conditions [, callback])

    • Model.deleteMany(conditions [, callback]

  • 統計文件數量

    • Model.count(conditions [,callback])

Document

  • save()

    • Model#save([options], [fn])

    • stu.save(function(err){
          if(!err){
              console.log("儲存成功");
          }
      })
      
  • update(update, [options], [callback])

    • 修改物件

    • StuModel.findOne({}, function(err, doc){
          if(!err){
              doc.update({$set:{age:28}}, function(err){
                  console.log("修改成功");
              });
              // console.log(doc);
          }
      });
      
  • remove([callback])

    • 刪除物件

    • StuModel.findOne({}, function(err, doc){
          if(!err){
              doc.remove(function(err){
                  if(!err){
                      console.log("大師兄再見");
                  }
              });
          }
      });
      
  • get(name)

    • 獲取文件中的指定屬性值
  • set(name, value)

    • 設定文件的指定的屬性值s
  • id

    • 獲取文件的_id 屬性值
  • toObject()

    • 將document物件轉換為普通的js物件
    • 轉換以後所有的document物件的方法都不能使用了

基本上一個下午的事件看完了整個視訊,只能說計算機語言真的就是相通的,資料庫的操作什麼感覺只要接觸過一個,大體就都差不多,只是可能看用的多不多,用的多熟練度高敲程式碼什麼的思路肯定會更快一些。然後因為這只是一個基於前端的資料庫的學習,學的並不深,都只是講了一些很淺顯的語法等內容,還是那句話,好多東西得用到了才能更快的上手。如果覺得看視訊時間不夠的可以看和,它們講解的也很淺顯,但是看一遍下來能理解的差不多了也,後續就自己查文件吧。