0x01 MongoDB 練習手札

Neilyozの魚不浪發表於2019-11-15

最近看Node.js相關的一些東西,跟著書上的教程實現了一個Express + MongoDB + Vue.js 實驗性專案,對於常年使用LNMP黃金搭檔的我來說,不用寫SQL語句真的是太爽了,也不用關心MySQL中的欄位增減,真的是太幸福了。

既然學習就肯定要動手,不動手的學習就是耍流氓!說幹就幹!

MongoDB的存入單元基本概念

  1. 資料庫databases
  2. 集合 collection
  3. 文件 document

正確的理解名詞有助於我們在未來的開發和工作中方便和他人進行溝通,MongoDB中可以存在多個資料,而資料庫中可以存在多個集合,每個集合中可以存放多條文件資料。

希望大家透過練習來掌握基礎MongoDB操作,別光看,動手敲! 別光看,動手敲! 別光看,動手敲!

  1. 進入my_practices資料庫
use my_practices
  1. 檢視資料庫
show dbs
  1. 向資料庫的user集合插入一個文件
// insertOne 增加語義化一些
// 在開發中,因為集合中存放了多個文件,所以集合命名我更加習慣用複數的形式
// 當然這種習慣性的東西不強制每個人,只是我的個人習慣
// 當然MongoDB查詢的方法還有insert,insertMany,分別是什麼可以感興趣的可以查詢文件。
db.users.insertOne({
    username: 'Tom',
    age: 18,
    gender: 'male'
})
  1. 查詢user集合中的文件
// find中可以傳遞空文件{},也可以什麼都不傳,表示查詢全部
db.users.find({})
  1. 向資料庫的user集合中再插入一個文件
db.users.insertOne({
    username: 'Jerry',
    age: 17,
    gender: 'male'
})
  1. 檢視當前資料庫user集合中的文件
db.users.find({})
  1. 統計資料庫user集合中的文件數量
db.users.find().count()
  1. 查詢資料庫user集合中username為Tom的文件
// 傳遞要查詢文件中需要滿足的條件
db.users.find({
    username: 'Tom'
})
  1. 向資料庫user集合中的username為Tom的文件,新增一個address屬性,屬性值為 Shenzhen.
// 修改指定文件對應的屬性
db.users.update({
    username: 'Tom'
}, {
    $set: {address: 'Shenzhen'}
})
  1. 使用{username: 'Herry'} 替換 username 為 Jerry 的文件
db.users.replaceOne({
    username: 'Jerry'
}, {
    username: 'Herry'
})
  1. 刪除 username 為 Tom 的文件的 address 屬性
// 刪除指定文件對應的屬性,為的是刪除屬性,所以屬性對應的值可以隨意
// 個人感覺值就是起了一個佔位作用,美化語句而已
db.users.update({
    username: 'Tom'
}, {
    $unset: {
        address: ''
    }
})
  1. 向 username 為 Tom 的文件中,新增一個hobby:{cities: ['BeiJing', 'ShangHai'], movies: ['Hero', 'King']}
// 修改之後,查詢的時候我發現在一些GUI中,hobby的屬性值被標記為Document
// 也就是說我們的hobby屬性儲存的是一個文件,這個文件叫做內嵌文件
db.users.update({
    username: 'Tom'
}, {
    $set: {
        hobby: {
            cities: ['BeiJing', 'ShangHai'],
            movies: ['Hero', 'King']
        }
    }
})
  1. 向 username 為 Herry 的文件中,新增一個hobby: {movies: ['Ip Man 1', 'Ip Man 2']}
db.users.update({
    username: 'Herry'
}, {
    $set: {
        hobby: {
            movies: ['Ip Man 1', 'Ip Man 2']
        }
    }
})
  1. 檢視喜歡電影為 Hero 的文件
// MongoDB 支援直接透過內嵌文件的屬性查詢
// 注意透過內嵌文件查詢,屬性名必須使用引號括起來
db.users.find({
    'hobby.movies': 'Hero'
})
  1. 向 Herry 的文件中新增新電影 Ip Man 3
// $push 用於向陣列中新增一個新的元素
// 題外話:$addToSet 和 $push 擁有相同的功能,只是前者檢測到集合中有這個值就不會新增
// 而後者不管資料是否重複
db.users.update({
    username: 'Herry'
}, {
    $push: {
        'hobby.movies': 'Ip Man 3'
    }
})
  1. 刪除喜歡 BeiJing 的使用者
db.users.remove({
    'hobby.cities': 'BeiJing'
})
  1. 刪除user集合
// 刪除集合中所有的文件,效率不高
db.users.remove({})
// 更加方便的方法為
db.users.drop()
  1. 向 numbers 集合中插入 20000 條資料
// 這種形式,我的I7電腦都用了9.8s才完成插入
for (var i = 1; i <= 20000; i++) {
    db.numbers.insert({
        num: i
    })
}

// 這種形式則舒爽很多,僅僅使用了0.5s
var arr = [];
for(var i = 1; i <= 20000; i++) {
    arr.push({num: i})
}
db.numbers.insert(arr)

// 專案開發中資料庫的方法能少呼叫盡量少呼叫
  1. 查詢 numbers 集合中 num 為 500 的文件
db.numbers.find({
    num: 500
})

// OR

db.numbers.find({
    num: {
        $eq: 500
    }
})

// 擴充套件: 不等於運算子為 $ne
  1. 查詢 numbers 中 num 大於 500 的文件
// 大於500的
db.numbers.find({
    num: {
        $gt: 500
    }
})

// 大於等於500的
db.numbers.find({
    num: {
        $gte: 500
    }
})

// 擴充套件:$lt 小於 | $lte 小於等於
  1. 查詢 numbers 中 num 小於 30 的文件
db.numbers.find({
    num: {
        $lt: 30
    }
})
  1. 查詢 numbers 中 num 大於 40 小於 50 的文件
db.numbers.find({
    num: {
        $gt: 40,
        $lt: 50
    }
})
  1. 查詢 numbers 中 num 大於 19996 的文件
db.numbers.find({
    num: {
        $gt: 19996
    }
})
  1. 檢視 numbers 集合中的前 10 條資料
db.numbers.find().limit(10)
  1. 檢視 numbers 集合中的第 11 條到 20 條資料
db.numbers.find().skip(10).limit(10)
  1. 檢視 numbers 集合中的第 21條到30條資料
db.numbers.find().skip(20).limit(10)
本作品採用《CC 協議》,轉載必須註明作者和本文連結
Neilyozの魚不浪

相關文章