年後的求職總算告一段落,在大數據班的課程當中,對求職最重要的、也最有幫助的應該是資料庫相關課程,雖然大數據班的專題實作鮮少有機會將SQL或NoSQL工具拿來實作,但是在實際工作場景,卻是基礎中的基礎,如果沒有將這項基本功練好,可是很難拿到資訊相關工作的門票喔。
多數的同學會在求職期間刷LeetCode的題目以保有求職市場的基本競爭能力,尤其數據相關工作,最基層的職缺如ETL工程師,就是非常需要熟練的SQL能力,可以在此網站進行鍛鍊,當然眾多的程式語言與資訊相關知識技術,都可以在此找到相應的練習題,在整理完成這一系列筆記之後,未來我也勢必得投入這塊,磨練我不純熟的資訊技能。
一、MariaDB
mysql資料夾結構
l bin資料夾:
myisamchk.exe用於檢查和修復MyISAM表;
mysql.exe用於啟動監視器;
mysqladmin.exe用於維護、管理;
mysqlbinlog.exe用於讀取日誌內容;
mysqld.exe用於啟動伺服器;
mysqldump.exe用於備份資料庫;
mysqlshow.exe用於獲取資料庫和資料表的訊息。
l data資料夾:
資料庫資料實際存放位置。
l share資料夾:
存放錯誤資訊。
MariaDB設定
l 進入MariaDB monitor:
cd C:\xampp\mysql\bin
# 管理員登入
mysql -u root
# 有密碼方式登入
mysql -h hostname -u username -p
-- 註解可用--、#、或/**/
-- 更改密碼
SET PASSWORD FOR root@localhost = password('yourpassword');
FLUSH PRIVILEGES;
-- 刪除匿名帳號
USE mysql;
DELETE FROM db WHERE user = '';
FLUSH PRIVILEGES;
-- 離開\q或QUIT
QUIT
l GRANT給予權限及產生帳號:
GRANT CREATE, SELECT, UPDATE, DELETE ON database_name.table_name TO
'database_user'@'localhost';
GRANT ALL ON *.* TO fred@localhost IDENTIFIED BY 'password';
l REVOKE取消權限但沒刪除帳號:
REVOKE ALL PRIVILEGES ON database_name.* FROM 'database_user'@'localhost';
REVOKE ALL ON employee.* FROM fred@localhost;
l DROP取消權限及刪除帳號:
DROP USER [IF EXISTS] 'database_user'@'localhost';
l 顯示用戶權限:
SHOW GRANTS FOR 'root'@'localhost';
l 顯示所有的權限:
SHOW PRIVILEGES;
l 執行作業系統批次檔BAT:
# 方式一
cd C:\xampp\mysql\bin
mysql -u username -p < filename
# 方式二要先進入MariaDB monitor
cd C:\xampp\mysql\bin
mysql -u root
SOURCE filename
權限種類
l 對資料庫,存放資料庫權限於db表格:
ALL PRIVILEGES, ALTER, CREATE, DELETE, DROP, FILE, INDEX, INSERT, PROCESS,
REFERENCES, RELOAD, SELECT, SHUTDOWN, UPDATE, USAGE
l 對資料表,存放資料表權限於Table_priv表格:
SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, INDEX, ALTER
l 對資料欄,存放資料欄權限於Columns_priv表格:
SELECT, INSERT, UPDATE
l 對使用者,存放帳號資料於user表格:
CREATE, CREATE TEMPORARY TABLES, DELETE, EXECUTE, INDEX, INSERT, LOCK TABLES,
SELECT, SHOW DATABASES, UPDATE, USAGE
l 對管理者,存放帳號資料於user表格:
ALL, ALTER, DROP, RELOAD, REPLICATION CLIENT, REPLICATION SLAVE, SHUTDOWN, SUPER
危險權限:FILE, PROCESS, WITH GRANT OPTION
資料庫正規化
l First Normal Form(第一正規化):
Each attribute or column value must be atomic. (去除重複)
l Second Normal Form(第二正規化):
Remove dependencies. (移除相依)
l Third Normal Form(第三正規化):
Remove all transitive dependencies. (移除遞移相依)
欄位資料型態
l TINYINT、SMALLINT、MEDIUMINT、INT、BIGINT:
整數型態
l FLOAT、DOUBLE、DECIMAL(M,
D):
浮點數型態,M為整數與小數位數的總位數,D為小數位數
l VARCHAR(N)、CHAR(N):
字串型態,VARCHAR為變動長度,CHAR為固定長度
l TIME、DATE、DATETIME:
日期時間型態
l BLOB:
二進位資料型態
伺服器、資料庫、資料表、索引
l 伺服器:
-- 列出伺服器的版本
SELECT version();
-- 列出當前用戶名
SELECT user();
-- 列出伺服器狀態訊息
SHOW STATUS;
-- 列出系統變數的值
SHOW VARIABLES;
-- 列出目前執行的程序
SHOW PROCESSLIST;
l 資料庫:
-- 建立資料庫
CREATE DATABASE [IF NOT EXISTS] database_name;
-- 印出有哪些資料庫
SHOW DATABASES;
-- 使用特定資料庫
USE database_name;
-- 印出目前使用哪個資料庫
SELECT database();
-- 刪除資料庫
DROP DATABASE database_name;
l 資料表:
-- 建立資料表
-- 多個欄位組成Primary Key寫法:PRIMARY KEY (employee_id, skill)
CREATE TABLE [IF NOT EXISTS] table_name (
employee_id INT NOT NULL AUTO_INCREMENT
PRIMARY KEY,
name VARCHAR(80),
job VARCHAR(30),
department_id INT NOT NULL,
FOREIGN KEY (department_id) REFERENCES
table2_name (department_id)]
) ENGINE = InnoDB;
-- 印出有哪些資料表
SHOW TABLES;
-- 印出特定資料表欄位
DESCRIBE table_name;
-- 刪除資料表
DROP TABLE table_name;
-- 資料表最佳化
ANALYZE TABLE table_name;
OPTIMIZE TABLE table_name;
l 索引:
-- 建立索引
CREATE [UNIQUE] INDEX index_name ON table_name (column);
-- 印出資料表目前使用的索引
SHOW INDEX FROM table_name;
-- 刪除索引
DROP INDEX index_name ON table_name;
-- 以更改方式增加唯一索引
ALTER TABLE table_name ADD UNIQUE (column);
-- 以更改方式增加普通索引
ALTER TABLE table_name ADD INDEX index_name (column);
l 備份與復原:
-- 檢查表格有無損壞,可用於InnoDB及MyISAM表格
CHECK TABLE table_name;
-- 修復表格,可用於InnoDB及MyISAM表格
REPAIR TABLE table_name;
-- 備份資料表至檔案,但只適用於MyISAM表格
BACKUP TABLE table_name TO 'c:/path/to/backup';
-- 從檔案復原資料表,但只適用於MyISAM表格
RESTORE TABLE table_name FROM 'c:/path/to/backup';
l 查看說明文件:
HELP contents;
HELP functions;
HELP 'comparison operators';
改以bin資料夾的應用程式做處理
l 伺服器:
# 印出伺服器狀態訊息
mysqladmin -u root -p extended-status > extended-status.txt
mysqladmin -u root -p status > status.txt
# 印出系統變數的值
mysqladmin -u root -p variables > variables.txt
# 印出目前執行的程序
mysqladmin -u root -p processlist
# 刪除目前執行的程序
mysqladmin kill id1, id2, id3
l 資料庫:
# 建立資料庫
mysqladmin create database_name -u root
# 印出有哪些資料庫
mysqlshow -u root
# 刪除資料庫
mysqladmin drop database_name -u root
l 備份與復原:
# 備份資料庫
mysqldump --opt -u username -p database_name > backup.sql
# 復原資料庫
mysql -u username -p database_name < backup.sql
# 備份資料庫,但要先關閉資料庫
mysqlhotcopy -u username -p database_name backup_location
# 修復表格,但只適用於MyISAM表格
myisamchk -q -r table
# 讀取二進制日誌
mysqlbinlog logfile > updates.sql
資料
l 輸入資料:
INSERT INTO department VALUES
(42, 'Finance'),
(128, 'Research and Development'),
(NULL, 'Human Resources'),
(NULL, 'Marketing');
l 更新資料:
UPDATE employee SET job = 'DBA' WHERE employee_id = '6651';
l 刪除資料:
DELETE FROM department WHERE name = 'Asset Management';
l 查詢資料:
SELECT columns FROM tables
[WHERE conditions]
[GROUP BY group]
[HAVING group_conditions]
[ORDER BY sort_columns]
[LIMIT limits];
查詢資料細節
l 查詢所有欄位再以升降冪排序:
SELECT * FROM employee ORDER BY job ASC, name DESC;
l 查詢所有欄位再限制筆數(起點以0開始, 資料筆數):
SELECT * FROM employee_skills LIMIT 5, 3;
l 查詢相異欄位總數:
SELECT count(DISTINCT job) FROM employee;
l 查詢指定的資料庫、表格、欄位:
SELECT database_name.table_name.column_name FROM table_name;
l 以指定的別名查詢:
SELECT name AS employee_name FROM employee;
SELECT e.name FROM employee AS e;
l 萬用字元查詢:
SELECT * FROM department WHERE name LIKE '%research%';
l 日期運算查詢:
SELECT adddate('1999-01-01', INTERVAL '1-6' YEAR_MONTH);
表格連結
l 表格連結方法一:
SELECT employee.name, department.name FROM employee, department
WHERE employee.department_id = department.department_id;
l 表格連結方法二:
SELECT employee.name, department.name FROM employee JOIN department
ON employee.department_id = department.department_id;
l 表格左連結:
SELECT employee.name FROM employee LEFT JOIN assignment
ON employee.employee_id = assignment.employee_id
WHERE client_id IS NULL;
l 表格自我連結,不包含Nora,查出和Nora同部門的人名:
SELECT e2.name FROM employee AS e1, employee AS e2
WHERE e1.name = 'Nora Edwards'
AND e1.department_id = e2.department_id
AND e2.name != 'Nora Edwards';
l 子查詢:
SELECT programmer.name FROM (
SELECT employee_id, name FROM employee
WHERE job = 'Programmer'
) AS programmer, assignment
WHERE programmer.employee_id = assignment.employee_id;
運算子
l 邏輯運算子:
AND與&&相同
OR與||相同
NOT與!相同
XOR
l 流程控制運算子if():
SELECT name, if(job='Programmer', 'Nerd', 'Not a Nerd') FROM employee;
l 流程控制運算子CASE:
SELECT workdate, CASE
WHEN workdate < 2000-01-01 THEN
'Archived'
WHEN workdate < 2003-01-01 THEN
'Old'
ELSE 'Current'
END
FROM assignment;
資料庫引擎InnoDB
l InnoDB:
預設引擎,副檔名為frm、ibd。
l 交易開始,產生緩衝區,交易結束,緩衝區資料寫入資料庫:
START TRANSACTION;
UPDATE account SET balance = balance - 1000 WHERE number = 2;
UPDATE account SET balance = balance + 1000 WHERE number = 1;
-- ROLLBACK;
COMMIT;
l 改變預設交易模式:
SET AUTOCOMMIT = 0;
l 交易隔離:
-- COMMIT後才能被其它程序讀取
SET TRANSACTION ISOLATION LEVEL READ COMMITTED;
-- 未COMMIT資料會被其它程序看到
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
l 交易隔離種類:
READ UNCOMMITTED Possible: Dirty Read, Nonrepeatable Read, Phantom Read
READ COMMITTED Possible: Nonrepeatable Read, Phantom Read
REPEATABLE READ Possible: Phantom Read
SERIALIZABLE Possible:
資料庫引擎MyISAM
l MyISAM:
副檔名為frm-儲存資料表定義、MYD-存放真正的資料、MYI-儲存索引資訊,因為MyISAM沒有交易功能,不必有額外緩衝區空間,若要避免多個連線交互執行SQL指令,造成資料錯亂,只好使用鎖定資料表的方式。
LOCK TABLES table_name [READ|WRITE];
UNLOCK TABLES;
l 只有MyISAM表格支援全文欄位:
CREATE TABLE article (
article_id INT NOT NULL AUTO_INCREMENT
PRIMARY KEY,
title VARCHAR(255),
body TEXT,
FULLTEXT (title, body)
) ENGINE = MyISAM;
l 全文欄位的索引:
CREATE FULLTEXT INDEX title ON article (title, body);
ALTER TABLE table_name ADD FULLTEXT (column);
l 全文欄位的查詢:
SELECT title FROM article WHERE MATCH (title, body) AGAINST ('merger');
l 布林模式全文查詢,配對單字可超過50%紀錄:
SELECT title FROM article WHERE MATCH (title, body) AGAINST ('linux' IN BOOLEAN
MODE);
查詢最佳化
l 效能基準測試,花了多少時間:
-- 6*9執行1000000次
SELECT benchmark(1000000, 6*9);
-- SQL指令執行10000000次
SELECT benchmark(10000000,
'SELECT employee.name, department.name
FROM employee, department
WHERE employee.department_id =
department.department_id');
l 在my.cnf或my.ini檔取消註解,開啟紀錄檔log-bin及開啟超過10秒的紀錄檔:
slow-query-log = 1
# 改為超過5秒
long_query_time = 5;
# 修改紀錄檔位置
slow-query-log-file = 'path/mysql-slow.log'
l 分析SQL指令有無使用索引:
-- type欄位顯示結果
-- ALL無使用索引
-- eq_ref外鍵參考
-- Index有使用索引
EXPLAIN
SELECT e.name, d.name FROM employee e, department d
WHERE e.department_id = d.department_id;
l 列出提供哪些選項可使用:
mysqld --verbose --help
透過Python操作MariaDB
l Python安裝MySQL Driver:
!pip install mysql-connector-python
l Python連接MySQL資料庫:
import mysql.connector
maxdb = mysql.connector.connect(
host = "127.0.0.1",
user = "root",
password = "",
#database = "maxdb",
)
cursor = maxdb.cursor()
l Python創建資料庫、資料表:
cursor.execute("CREATE DATABASE maxdb")
cursor.execute("USE maxdb")
cursor.execute("CREATE TABLE users (name VARCHAR(255), age INTEGER(99),
user_id INTEGER AUTO_INCREMENT PRIMARY KEY)")
l Python新增MySQL資料:
sqlStuff = "INSERT INTO users (name, age) VALUES (%s, %s)"
records = [("Steve", 24),
("Max", 25),
("Chang", 26)]
cursor.executemany(sqlStuff, records)
maxdb.commit()
l Python讀取MySQL資料:
cursor.execute("SELECT * FROM users WHERE name LIKE 'M%'")
result = cursor.fetchall()
for row in result:
print(row)
l Python更新MySQL資料:
cursor.execute("UPDATE users SET age = 23 WHERE user_id = 3")
maxdb.commit()
l Python刪除MySQL資料:
cursor.execute("DELETE FROM users WHERE user_id = 4")
maxdb.commit()
cursor.execute("DROP TABLE IF EXISTS users")
maxdb.commit()
二、MongoDB
MongoDB基礎
l 拿鐵派的馬克Blog:
https://mark-lin.com/tags/mongodb/
l RDBMS與MongoDB等價術語比較:
RDBMS術語 == MongoDB術語
Database == Database
Table == Collection
Tuple/Row == Document
Column == Field
Table Join == Embedded Documents
Primary Key == Primary Key (如果沒有設定,MongoDB會自動給予預設主鍵值_id欄位)
l 執行MongoDB (Server):
# 可以寫成start.bat
cd C:\Program Files\MongoDB\Server\4.2\bin
mongod --dbpath c:\learndb\db
l 使用MongoDB Shell (Client):
# 可以寫成shell.bat
cd C:\Program Files\MongoDB\Server\4.2\bin
mongo
show dbs
use test
exit
輸入資料
l 單筆輸入資料:
# db為目前資料庫,user為Collection
# {}裝資料、[]是陣列、()是函數
db.user.insert({
# Key加引號或不加皆可
name: "mark",
age: 100,
title: 'Mark BIG BIG'
});
l 多筆輸入資料:
# 同JavaScript,可以不宣告var
var user1 = {
"name": "Mark",
"age": 18,
"bmi": 10
}, count = 1000, users = [];
for(var i=0; i<count; i++){
users.push(user1);
}
# {ordered: false}代表如果其中一筆資料有問題,輸入不會停下來
db.user.insert(users, {ordered: false});
l 緩衝區輸入資料(效能方法):
# 其中一筆資料有問題,輸入會停下來
var bulk = db.user.initializeOrderedBulkOp();
bulk.insert({"name": "mark"});
bulk.insert({"name": "hoho"});
bulk.execute();
# 其中一筆資料有問題,輸入不會停下來
var bulk = db.user.initializeUnorderedBulkOp();
bulk.insert({"name": "mark"});
bulk.insert({"name": "hoho"});
bulk.execute();
更新資料
l 一般更新資料:
# db.collection.update(查詢條件, 更新內容,
{upsert: true, multi: true});
# 查詢條件若為{}空集合,代表所有條件
# upsert如果沒有找到該更新的對象則新增
# multi不只會更新找到的第一筆資料
db.user.update({"name": "mark"}, {"name": "mark",
"age": 18});
l 修改器$set更新資料,效果同一般更新資料:
db.user.update({"name": "mark"}, {"$set":
{"age": 18}});
l 修改器$inc更新資料,數值每次加1:
db.user.insert({"id": 1, "like": 0});
db.user.update({"id": 1}, {"$inc": {"like": 1}});
db.user.update({"id": 1}, {"$inc": {"like": 1}});
db.user.update({"id": 1}, {"$inc": {"like": 1}});
l 修改器$push更新資料陣列,會在陣列的尾末加上一個新元素:
db.user.insert({
"name": "mark",
"fans": ["steven",
"crisis", "stanley"]
})
db.user.update(
{"name": "mark"},
{$push: {"fans":
"jack"}
})
l 修改器$push更新資料陣列,搭配$each新增多筆:
db.user.update(
{"name": "mark"},
{"$push": {"fans":
{"$each": ["jack", "landry", "max"]}}}
)
l 修改器$push更新資料陣列,搭配$slice保留最後n個元素:
db.user.update(
{"name": "mark"},
{"$push": {"fans":
{"$each": ["jack", "landry", "max"], "$slice":
-5}}}
)
l 修改器$addToSet更新資料陣列,檢查新增的值是否已存在:
db.user.update(
{"name": "mark"},
{"$addToSet":
{"fans": {"$each": ["steven",
"jack"]}}}
)
l 修改器$pop更新資料陣列,1代表從陣列尾刪除:
db.user.update(
{"name": "mark"},
{"$pop": {"fans":
1}}
)
l 修改器$pull更新資料陣列,基於特定條件刪除:
# 單一條件
db.user.update(
{"name": "mark"},
{"$pull": {"fans":
"crisis"}}
)
# 多個條件
db.user.update(
{"name": "mark"},
{"$pull": {"fans":
{"$in": ["crisis", "stanley"]}}}
)
刪除資料
l 一般刪除資料:
# db.collection.remove(查詢條件, 刪除內容, {justOne:
true});
# justOne代表查詢到的只會刪第一個
db.user.remove({"name": "steven"});
l 刪除所有資料:
# 索引不會刪除
db.user.remove({});
# 索引會刪除
db.user.drop();
l 緩衝區刪除資料(效能方法):
# 其中一筆資料有問題,輸入不會停下來
var bulk = db.user.initializeUnorderedBulkOp();
bulk.find({"name": "mark"}).remove();
bulk.execute();
查詢資料
l 搜尋條件:
$and代表AND
$or代表OR
$not代表NOT
$nor代表NOR
$gt代表大於
$gte代表大於等於
$lt代表小於
$lte代表小於等於
$ne代表不等於
$in代表包含
$nin代表不包含
$all代表尋找多個元素結合的Document
$size代表尋找特定長度的陣列
$slice代表尋找指定回傳的陣列,例如10為前十條
$elemMatch代表只針對陣列,進行多組查詢
l 查詢資料範例一,尋找年紀30歲以上(包含30),但不滿60歲(不包含60),粉絲又有200人以上(包含200)的人:
# 寫法一
db.user.find({
"age": {"$gte": 30,
"$lt": 60},
"fans": {"$gte":
200}
});
# 寫法二
db.user.find(
{"$and": [{"age":
{"$gte": 30, "$lt": 60}}, {"fans":
{"$gte": 200}}]}
);
l 查詢資料範例二,尋找年齡不為25、60的人,只給ID就好:
db.user.find({"age": {"$nin": [25,60]}}, {"id": 1});
l 查詢資料範例三,Cursor方法:
db.user.find().count();
db.user.find().skip(5).limit(50).sort({x: 1});
l 查詢資料範例四,尋找粉絲中同時有steven與max的人:
db.user.find({"fans": {"$all": ["steven",
"max"]}});
l 查詢資料範例五,尋找粉絲總共有3位的人:
db.user.find({"fans": {"$size": 3}});
l 查詢資料範例六,尋找mark的第一位粉絲:
db.user.find({"name": "mark"}, {"fans":
{"$slice": 1}});
l 查詢資料範例七,尋找x中至少有一個值大於30小於100的人:
db.user.find({"x": {"$elemMatch": {"$gt": 30,
"$lt": 100}}});
l 查詢資料範例八,尋找名字為s開頭的人:
db.user.find({"name": /^s/});
l 查詢資料範例九,檢視尋找速度:
db.user.find({"x": 1}).limit(1).explain("executionStats");
db.user.find({"x":
999}).limit(1).explain("executionStats");
索引
l 建立指定欄位的索引:
# 將產出索引x_1,1代表由小到大,-1代表由大到小,對排序有影響
db.user.ensureIndex({"x": 1});
l 檢視索引是否建立成功:
db.user.getIndexes();
l 刪除指定欄位的索引:
db.user.dropIndex("x_1");
l 刪除所有索引:
db.user.dropIndexes();
l 不適合使用索引的範例情境:
for(var i=0; i<10000; i++){
var value =
(i<6000)?"1":"2";
db.test.insert({"x": value});
}
db.test.find({"x":
"1"}).explain("executionStats");
db.test.ensureIndex({"x": 1});
db.test.find({"x": "1"}).explain("executionStats");
l 選擇使用複合索引的範例情境:
db.user.find({}).sort({"age": 1}).explain("executionStats");
# 索引一
db.user.ensureIndex({"name": 1, "age": 1});
# 索引二,選擇此索引較佳
db.user.ensureIndex({"age": 1, "name": 1});
以bin資料夾的應用程式做處理
l 匯出與匯入:
cd C:\Program Files\MongoDB\Server\4.2\bin
# 匯出
mongoexport --db test --collection user --out "C:\Shared\NoSQL\user.json"
# 匯入
mongoimport --db test --collection user2 --file "C:\Shared\NoSQL\user.json"
l 備份與復原:
# 備份
mongodump --db test --collection user --out "C:\Shared\NoSQL"
# 復原
mongorestore --db test --collection user3 "C:\Shared\NoSQL\user.bson"
透過Python操作MongoDB
l Python安裝MongoDB Driver:
!pip install pymongo
l Python連接MongoDB資料庫:
import pymongo
# client = pymongo.MongoClient("mongodb://localhost:27017/")亦可
client = pymongo.MongoClient(host="localhost", port=27017)
l Python指定資料庫(Database)、資料表(Collection):
# db = client["test"]亦可
db = client.test
# collection = db["students"]亦可
collection = db.students
l Python新增MongoDB資料:
# 單筆新增資料
student = {"id": "20170101", "name": "Jordan",
"age": 20, "gender": "male"}
result = collection.insert_one(student)
# 多筆新增資料
student1 = {"id": "20170101", "name":
"Jordan", "age": 20, "gender": "male"}
student2 = {"id": "20170202", "name":
"Mike", "age": 21, "gender": "male"}
result = collection.insert_many([student1, student2])
l Python讀取MongoDB資料之一:
# 單筆讀取資料
result = collection.find_one({"name": "Mike"})
print(result)
# 多筆讀取資料
results = collection.find({"age": {"$gt": 20}})
print(result for result in results)
l Python讀取MongoDB資料之特殊功能符號:
$regex代表匹配正規表示式
$exists代表屬性是否存在
$type代表類型判斷
$mod代表數字餘數操作
$text代表文字查詢
$where代表高級條件查詢
l Python讀取MongoDB資料之二:
# 計數
count = collection.count_documents({"age": 20})
print(count)
# 排序
results = collection.find().sort("name", pymongo.ASCENDING)
print([result["name"] for result in results])
# 偏移,忽略前兩個元素,再限制取兩個元素
results = collection.find().sort("name",
pymongo.ASCENDING).skip(2).limit(2)
print([result["name"] for result in results])
# 大數據時改用ObjectId處理較佳
from bson.objectid import ObjectId
collection.find({"_id": {"$gt": ObjectId("593278c815c2602678bb2b8d")}})
l Python更新MongoDB資料:
# 單筆更新資料,方法一
condition = {"name": "Jordan"}
student = collection.find_one(condition)
student["age"] = 25
result = collection.replace_one(condition, student)
print(result)
# 單筆更新資料,方法二
condition = {"name": "Jordan"}
student = collection.find_one(condition)
student["age"] = 25
result = collection.update_one(condition, {'$set': student})
print(result)
# 多筆更新資料
condition = {"age": {"$gt": 20}}
result = collection.update_many(condition, {"$inc": {"age":
1}})
print(result, result.matched_count, result.modified_count)
l Python刪除MongoDB資料:
# 單筆刪除資料
result = collection.delete_one({"name": "Jordan"})
print(result, result.deleted_count)
# 多筆刪除資料
result = collection.delete_many({"age": {"$lt": 25}})
print(result, result.deleted_count)
沒有留言:
張貼留言