MonogoDB 數據庫基本使用和常用命令

本文簡單介紹了 mongodb 數據庫的基本概念以及基礎用法

一、簡介

  • MongoDB 是爲快速開發互聯網 Web 應用而設計的數據庫系統
  • MongoDB 的設計目標是極簡、靈活、作爲 Web 應用棧的一部分
  • MongoDB 的數據模型是面向文檔的,所謂文檔,是一種類似於 JSON 的結構,簡單理解 MongoDB 這個數據庫中存的是各種各樣的 JSON(BJSON)

二、相關概念及名詞

  • 數據庫:是一個倉庫,在倉庫中可以存放集合

  • 集合

    • 類似於數組,在集合中可以存放文檔
    • 存儲的文檔可以是多種多樣的,沒有格式要求
  • 文檔

    • 數據庫中的最小單位,對數據庫進行存儲和操作的內容都是文檔
    • 類似於 JS 中的對象,在 MongoDB 中每一條數據就是一個文檔

多個文檔組成集合,多個集合組成數據庫


三、常用指令

基本指令

  • show dbs/ databases: 顯示當前的所有數據庫
  • use 數據庫名:進入到指定的數據庫中 eg: use my_test
  • db :表示的是當前所處的數據庫
  • show collections:顯示數據庫中所有的集合

增刪改查(CRUD)指令

新增(INSERT)

  • 向數據庫中插入文檔:db.<collection>.insert(doc)
    • 向集合中插入一個或多個文檔
    • 向集合中插入文檔時,如果沒有給文檔指定 id 屬性,則數據庫會自動爲文檔添加 _id,該屬性用來作爲文檔的唯一標識
    • _id 我們可以自己指定,如果我們指定了,則數據庫就不會再自動生成了。如果自己指定 _id,也必須確保它的唯一性
    • 例子:向 test 數據庫中的 students 集合中插入一個新的學生對象:{name: "小明", age: 18, addr: "male"}
      use test;
      db.students.insert({name: "小明", age: 18, addr: "三味書屋"});
      
  • db.<collection>.insertOne(doc):向數據庫中插入一條數據
  • db.<collection>.insertMany(doc):向數據庫中插入多條數據

示例:

use test;

// 插入一條
db.students.insert({name: "小明", age: 18, addr: "三味書屋", salary: 3000});

// 插入多條
db.students.insert([{name: "小紅", age: 16, addr: "東方明珠", salary: 5000}, {name: "小白", age: 19, addr: "王府井", salary: 6000}]);

// 等同於下面的方式

// 插入一條
db.students.insertOne({name: "小明", age: 18, addr: "三味書屋", salary: 3000});

// 插入多條
db.students.insertMany([{name: "小紅", age: 16, addr: "東方明珠", salary: 5000}, {name: "小白", age: 19, addr: "王府井", salary: 6000}]);

查詢(QUERY)

  • db.<collection>.find()
    • 默認查詢當前集合中的所有文檔
    • find({}):也是查詢當前集合中所有的文檔
    • 返回的是一個數組
    • 接收一個對象作爲參數,必須滿足對象中所有的屬性
    • .count(): 查詢出所有結果的數量
    • .length(): 查詢出所有結果的數量
  • db.<collection>.findOne():查詢集合中符合條件的第一個文檔
    • 返回的是一個對象
use test

// 查詢集合中所有的文檔(實際項目中不會這麼操作)
db.students.find();

// 查詢集合中符合條件的所有文檔
db.students.find({ age: 19 });

// 查詢符合條件的第一個文檔
db.students.findOne({ age: 19 });

// 查詢符合條件的文檔數目
db.students.find({ age: 19 }).count();
// 或
db.students.find({ age: 19 }).length();
投影
  • db.<collection>.find(filter, options)
    • filter:查詢條件對象
    • options: 投影條件對象,需要展示的屬性設置爲 1,不需要展示的屬性設置爲 0
  • .limit(num):顯示多少個文檔
  • .skip(num):跳過多少個文檔
  • .sort({ key1: 1, key2: -1 }):按照 key1 正序排列,排完之後再按照 key2 倒序排列

示例

use test;

// 查詢 students 集合中所有對象,只展示 age 字段
db.students.find({}, { age: 1 });

// 查詢 students 集合中所有對象,不展示 age 字段
db.students.find({}, { age: 0 });

// 查詢 students 集合,只展示符合條件的前 2 條數據
db.students.find({}).limit(2);

// 查詢 students 集合中所有對象,跳過前 2 條數據
db.students.find({}).skip(2);

// 查詢 students 集合中所有對象,按 age 正序排列
db.students.find({}).sort({ age: 1 });

// 查詢 students 集合中所有對象,按 age 倒序排列
db.students.find({}).sort({ age: -1 });
常用查詢器
  • $gt:大於
  • $gte:大於等於
  • $eq:等於
  • $lt:小於
  • $lte:小於等於
  • $or:或者

之前查詢不使用任何查詢器時,條件的判斷是包含,不是相等

示例:

// 工資大於 3000
db.students.find({salary: { $gt: 3000 }});

// 工資大於等於 3000
db.students.find({salary: { $gte: 3000 }});

// 工資等於 3000
db.students.find({salary: { $eq: 3000 }});

// 工資小於 6000 
db.students.find({salary: { $lt: 6000 }});

// 工資小於等於 6000
db.students.find({salary: { $lte: 6000 }});

// 工資大於 3000 且小於 6000 
db.students.find({salary: { $gt: 3000, $lt: 6000 }});

// 工資是 3000 或者 名字是 小白
db.students.find({$or: [ {salary: 3000}, {name: "小白"} ]});

更新(UPDATE)

  • db.<collection>.update(查詢條件, 新對象, [options])
    • options: 配置對象
      • upsert: <boolean>
      • multi: <boolean> 是否跟新多條,默認是 false
      • writeConcern: <document>
      • collation: <document>
    • update() 默認情況下會使用新對象來替換舊的對象
    • 如果需要修改指定的屬性,而不是替換,則需要使用 “修改操作符” 來完成
    • $set: 修改操作符,修改屬性值。
    • $unset: 修改操作符,刪除屬性值。
      • db..update({ name: “zgd” }, {$set: { age: 21 }})
    • 默認情況下只會更新匹配到的第一個文檔對象
  • db..updateOne(查詢條件, 新對象):修改第一個符合條件的文檔
  • db..updateMany(查詢條件, 新對象):同時修改多個符合條件的文檔
  • db..replaceOne(查詢條件, 新對象):替換一個文檔

示例

use test

// 修改一條數據
db.students.update({name: '小明'}, {$set: { age: 19 }});

// 等同於 updateOne
db.students.updateOne({name: '小明'}, {$set: { age: 19 }});

// 修改多條數據
db.students.update({age: 19}, {$set: { addr: '水月洞天' }}, { multi: true });

// 等同於 updateMany
db.students.updateMany({age: 19}, {$set: { addr: '水月洞天' }});

// 數據替換
db.students.update({age: 16}, { name: '小花', age: 14, addr: '迪士尼樂園' });

// 等同於 replaceOne
db.students.replaceOne({age: 16}, { name: '小花', age: 14, addr: '迪士尼樂園' });

常用修改器:

  • $set: 設置屬性
  • $unset:刪除屬性
  • $push:向數組中添加一條數據
  • $addToSet:向數組中添加一條數據,與 $push 的區別:若數據已存在,則不再添加
  • $inc(只能用於 Number 類型的值):用來增加已有屬性的值,若屬性不存在,則創建該屬性
// 修改 addr 屬性
db.students.updateMany({age: 19}, { $set: { addr: '花果山' } });

// 爲小花刪除 age 屬性
db.students.updateOne({name: '小花' }, { $unset: { age: '' } });

// 先爲小明添加一個 hobby 屬性,其中有一個 cities 屬性是一個數組
db.students.updateOne({name: '小明' }, { $set: { hobby: { cities: '北京', '上海' } } });
// 爲小明的 cities 屬性 添加一個 '杭州',可以通過 . 操作符爲下級屬性賦值,但是必須用 "" 引號包裹起來
db.students.updateOne({name: '小明' }, { $push: { "hobby.cities": '杭州' } });

// 將 addr 爲 '花果山' 的文檔,年齡都加 2 歲
db.students.updateMany({addr: '花果山'}, { $inc: { age: 2 } });

刪除(DELETE)

  • db.<collection>.remove(查詢條件, [justone]])
    • 默認刪除所有符合條件的文檔
    • 不傳查詢對象會報錯
    • 如果傳遞一個空對象 {} 作爲參數,則會刪除集合中的所有數據。使用這種方式清空集合性能較差
    • justone<boolean> 默認是 false,設置爲 true,則只會刪除匹配到的第一個文檔
  • db.<collection>.deleteOne(查詢條件):刪除匹配到的第一個文檔
  • db.<collection>.deleteMany(查詢條件):刪除匹配到的所有文檔

示例

// 刪除一條
db.students.remove({ name: '小花' }, true);

// 等同於 deleteOne
db.students.deleteOne({ name: '小花' });

// 刪除多條
db.students.remove({ age: '19' });

// 等同於
db.students.deleteMany({ age: '19' });

// 刪除所有數據(不建議使用這種方式清空數據,速度較慢)
db.students.deleteMany({});

刪除集合和數據庫

  • db.<collection>.drop(): 刪除集合
  • db.dropDatabase():刪除數據庫

示例

// 刪除 students 集合(建議使用這種方式清空數據,速度較快)
db.students.drop();

// 刪除當前數據庫
db.dropDatabase();

四、參考鏈接

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章