資料庫

Redis 與 MongoDB 的操作速查,前半是 Redis 的環境設定與各型別語法,後半是 Mongo 的查詢、索引與增刪改。

1. Redis

Redis Client 套件

  • ServiceStack.Redis(主流)
  • StackExchange.Redis
  • CSRedisCore

Redis Client 主流套件:ServiceStack.Redis

Redis Server 前置作業

跑 Redis Container(沒有密碼版本):

docker run -d --name redis_server2 --restart unless-stopped -p 6380:6379 -v redis-data:/data redis:7 redis-server --appendonly yes

跑 Redis Container(密碼版本):

docker run -d --name redis_server --restart unless-stopped -p 6379:6379 -v redis-data:/data redis:7 redis-server --requirepass '{mystrongpassword}' --appendonly yes

進入 Container:

docker exec -it redis_test /bin/bash

開啟沒有設密碼的 Redis Client:

redis-cli

開啟設密碼的 Redis Client:

redis-cli -h 127.0.0.1 -p 6379 -a '{mypassword}'

離開 redis:

quit or exit

確認 redis 版本:

redis-cli --version

Config 設定

  • LRU:最近最少使用,優先淘汰
  • LFU:使用次數最少,優先淘汰

最大使用記憶體限制:

config get maxmemory
config set maxmemory 512mb

記憶體釋放策略:

config get maxmemory-policy
config set maxmemory-policy allkeys-lru
  • noeviction:預設策略。不進行淘汰,記憶體滿時回傳錯誤。
  • allkeys-lru:所有 key 均使用 LRU 策略進行淘汰。
  • volatile-lru:僅針對設有 TTL 的 key 使用 LRU。
  • allkeys-lfu:所有 key 均使用 LFU 策略。
  • volatile-lfu:僅淘汰設有 TTL 的 key,依據使用頻率。
  • allkeys-random:隨機淘汰任意 key,不考慮使用狀況。
  • volatile-random:隨機淘汰設有 TTL 的 key。
  • volatile-ttl:淘汰 TTL 剩餘時間最短的 key。

快取效果觀察:

info stats

Redis 語法參考網路資源:https://www.runoob.com/redis/redis-sets.html

Redis 語法:新增

設定值,key 不存在新增,存在則覆蓋:

set [key] [value]

設定值,並且 10 秒後自動過期:

set [key] [value] ex 10

Redis 語法:查詢

取值(沒有值,回傳 nil):

get [key]

keys 查詢,正式運行的伺服器中勿使用:

keys *

keys 查詢:

scan 0

資料型態查詢:

type [key]

Redis 語法:數值計算

值遞增:

INCR [key]

指定遞增數 +5:

INCR [key] 5

指定遞減數 -3:

DECR [key] 3

Redis 語法:字串處理

傳回字串長度:

strlen [key]

在字串結尾串接新字串:

append [key] [appendString]

Redis 語法:列表

把 a 元素塞進 list1 之中(往左側塞入),若無 list1 則自動建立新的:

lpush list a

把 a 元素塞進 list1 之中(往右側塞入),若無 list1 則自動建立新的:

rpush list a

把 a 元素塞進 list1 之中(往右側塞入),若無 list1 則塞入失敗:

lpushx list a

看 arr 0 到 100 的元素(-1 代表最後一個項目):

lrange arr 0 100

Redis 語法:不重複集合

新增元素:

sadd [key] [itemName1] [itemName2]

取得集合數:

scard [key]

列出元素清單:

sdiff [key]
smembers [key]

Redis 語法:Hash

設定 hash 表 key 與 value:

hset [HashTableName] [key] [value]

設定 hashmap(一次設定多個 set):

hmset [HashTableName] [key1] [value1] [key2] [value2].....

取得 hash 表所有鍵與值:

hgetall [HashTableName]

取得 hash 表某個鍵的值:

hget [HashTableName] [key]

集合

Redis Client - StackExchange.Redis 網路資源:https://maxlin0523.github.io/2022/06/15/redis-usage/

2. Mongo 語法

查看所有資料庫清單:

show dbs

切換資料庫,沒有此資料庫,新增資料就會自動建立:

use mydb

查看目前在哪個資料庫:

db

列出所有集合(資料表):

show collections

查詢運算子

  • $gt 大於
  • $lt 小於
  • $gte 大於等於
  • $lte 小於等於
  • $ne 不等於
  • $in 在陣列中

索引

查詢索引:

db.users.getIndexKeys()
db.users.getIndexes()

建立索引:

db.users.createIndex(
  { 
    'Name': 1,      // 1 代表升序 (Ascending)
    'Age': 1, // 1 代表升序 (Ascending)
    '_id': -1
  }, 
  { 
    'name': 'Name_1_Age_1__id_-1' // (選填) 幫索引取個名字,方便日後管理
  }
)

確認查詢狀態(有無命中索引):

db.users.find({ roleId: { $in: [1,2,3] } }).explain('executionStats')
db.runCommand({
  explain: {
    count: 'users',
    query: { 
        roleId: { $in: [1,2,3] } }
    },
  verbosity: 'executionStats'
})

查詢

db.users.find({ roleId: { $in: [1,2,3] } })
db.users.find({ name: { $in: ['mary','joe'] } })
db.users.find({ age: { $gt: 30, $lt: 60 } })

同時符合多個條件:

db.users.find({ age: { $gte: 18 }, status: 'active' })
db.users.find({ $and: [ { age: { $gte: 18,$lte: 18 } }, { status: 'active' } ] })

Or 條件:

db.users.find({
  $or: [
    { status: 'active' },
    { age: { $lt: 18 } }
  ]
})

更新

單筆資料更新單一欄位:

db.collection.updateOne(
  { _id: ObjectId('64fa8fcb5e4b2c12a1d9f123') },
  { $set: { status: 'active' } }
)

單筆資料更新多個欄位:

db.collection.updateOne(
  { _id: ObjectId('64fa8fcb5e4b2c12a1d9f123') },
  { 
    $set: {
      status: 'active',
      lastUpdate: new Date()
    }
  }
)

多筆資料更新多個欄位:

db.collection.updateMany(
  { status: 'inactive' },
  { $set: { status: 'active' } }
)

刪除資料:

db.collection.updateOne(
  { _id: ObjectId('64fa8fcb5e4b2c12a1d9f123') },
  { $unset: { tempField: '' } }
)

排序、分頁

排序、限制筆數:

db.users.find().sort({ age: -1 }).limit(5)
  • age: -1:依照 age 由大到小排序。
  • age: 1:依照 age 由小到大排序。
  • limit(5):只取前 5 筆

分頁查詢:skip + limit

db.users.find().skip(10).limit(5)  // 跳過前10筆,顯示5筆

使用 .pretty() 美化輸出:

db.users.find().pretty()

陣列查詢:

db.posts.find({ tags: 'mongodb' }) // 查找含有這個 tag 的文章

find() 的參數

  • 第一個參數:查詢條件(filter)
  • 第二個參數(可選):欄位投影(哪些欄位要顯示);若要全部顯示,則省略此參數。

範例:

db.users.find({
  Time: {
    $gte: ISODate('2025-10-21T00:00:00Z'),
    $lte: ISODate('2025-10-21T14:55:00Z')
  },
  Type: { $in: [1, 6] }
}, {
  _id: 0,
  Time: 1,
  HumanType: 1
})

用參數實現查詢結果:

let name = 'John'
db.users.find({ name: name })

新增與刪除

建立資料,如果沒有此資料表則會自動建立:

db.testcollection.insertOne({ name: 'Alice', age: 28 })

刪除第一筆符合條件的資料:

db.users.deleteOne({ name: 'Alice' })

刪除符合條件的資料:

db.users.deleteMany({ status: 'inactive' })

清空整個集合:

db.logs.deleteMany({})

刪除整個集合:

db.logs.drop()

刪除整個資料庫:

use myDatabase
db.dropDatabase()