2021年2月28日 星期日

BDSE15 - Learn Database

  年後的求職總算告一段落,在大數據班的課程當中,對求職最重要的、也最有幫助的應該是資料庫相關課程,雖然大數據班的專題實作鮮少有機會將SQLNoSQL工具拿來實作,但是在實際工作場景,卻是基礎中的基礎,如果沒有將這項基本功練好,可是很難拿到資訊相關工作的門票喔。

  多數的同學會在求職期間刷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;

--
離開\qQUIT
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   TINYINTSMALLINTMEDIUMINTINTBIGINT
整數型態

l   FLOATDOUBLEDECIMAL(M, D)
浮點數型態,M為整數與小數位數的總位數,D為小數位數

l   VARCHAR(N)CHAR(N)
字串型態,VARCHAR為變動長度,CHAR為固定長度

l   TIMEDATEDATETIME
日期時間型態

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   備份與復原:
--
檢查表格有無損壞,可用於InnoDBMyISAM表格
CHECK TABLE table_name;
--
修復表格,可用於InnoDBMyISAM表格
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
預設引擎,副檔名為frmibd

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.cnfmy.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   RDBMSMongoDB等價術語比較:
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
為目前資料庫,userCollection
# {}
裝資料、[]是陣列、()是函數
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   查詢資料範例二,尋找年齡不為2560的人,只給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   查詢資料範例四,尋找粉絲中同時有stevenmax的人:
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_11代表由小到大,-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)

沒有留言:

張貼留言