翻譯原文:MongoDB 官方文檔: SQL to MongoDB Mapping Chart
不少開發者首次接觸數據庫(一般是在高校課堂)的概念,或者說接觸第一個數據庫,一般是 SQL 數據庫,而如今,NoSQL 數據庫愈來愈流行,不少原 SQL 數據的使用者不免有轉向 NoSQL 的需求。而做爲 NoSQL 數據庫的表明,MongoDB 在社區愈來愈流行,生產環境的使用也日益普遍。mysql
對於 SQL 轉戰 NoSQL的開發人員來講,最難的一步實際上是將原有的 SQL 的概念和知識直接複用過來,最大化的減少學習的成本。sql
其實,這一步 MongoDB 官方已經爲你們考慮到了,那就是在:MongoDB CRUD Operations
> MongoDB CRUD Operations
> SQL to MongoDB Mapping Chart,這篇文檔很是好的總結了 SQL 對應 MongoDB 的術語和概念,還有可執行文件、SQL 語句/MongoDB 語句等,mongodb
能夠說對於 SQL 數據庫開發人員,若是理解了他們之間的對應關係,那麼就一隻腳就邁進了 MongoDB 的大門。數據庫
下表介紹了各類 SQL 術語和概念以及相應的 MongoDB 術語和概念.json
SQL術語/概念 | MongoDB 術語/概念 |
---|---|
database | database |
table | collection |
row | document 或 BSON document |
column | field |
index | index |
table joins (表聯接) | $lookup, embedded documents (嵌入式文檔) |
primary key 指定任何惟一的列或者列組合做爲主鍵 | primary key 在 MongoDB 中, 主鍵自動設置爲 _id 字段 |
aggregation (如:group by) | aggregation pipeline (聚合管道) 參考:SQL to Aggregation Mapping Chart |
SELECT INTO NEW_TABLE | $out 參考: SQL to Aggregation Mapping Chart |
MERGE INTO TABLE | $merge (從MongoDB 4.2開始可用) 參考:SQL to Aggregation Mapping Chart |
transactions | transactions |
TIP在許多狀況下,
非規範化數據模型(嵌入式文檔和數組) denormalized data model (embedded documents and arrays)
將繼續是您數據和用例的最佳選擇,而不是多文檔事務. 也就是說,對於許多場景,對數據進行適當的建模將最大限度地減小對多文檔事務(multi-document transactions)
的需求。數組
下表顯示了一些數據庫可執行文件和相應的 MongoDB 可執行文件。 這張表並非詳盡無遺的。oracle
MongoDB | MySQL | Oracle | Informix | DB2 | |
---|---|---|---|---|---|
Database Server | mongod | mysqld | oracle | IDS | DB2 Server |
Database Client | mongo | mysql | sqlplus | DB-Access | DB2 Client |
下表顯示了各類 SQL 語句和相應的 MongoDB 語句。 表中的例子假定如下條件:app
{ _id: ObjectId("509a8fb2f3f4948bd2f983a0"), user_id: "abc123", age: 55, status: 'A' }
CREATE TABLE people ( id MEDIUMINT NOT NULL AUTO_INCREMENT, user_id Varchar(30), age Number, status char(1), PRIMARY KEY (id) )
db.people.insertOne( { user_id: "abc123", age: 55, status: "A" } )
在第一個 insertOne() 或 insertMany() 操做上隱式建立。 若是沒有指定 _id
字段,則自動添加主鍵 _id
。學習
可是,您也能夠顯式地建立一個集合:spa
db.createCollection("people")
ALTER TABLE people ADD join_date DATETIME
db.people.updateMany( { }, { $set: { join_date: new Date() } } )
集合不描述或強制執行其文檔的結構;也就是說,在集合級別上沒有結構上的改變。
可是,在文檔級別,updateMany() 操做能夠使用 $set 操做符向現有文檔添加字段。
ALTER TABLE people DROP COLUMN join_date
db.people.updateMany( { }, { $unset: { "join_date": "" } } )
集合不描述或強制執行其文檔的結構;也就是說,在集合級別上沒有結構上的改變。
可是,在文檔級別,updateMany() 操做能夠使用 $unset 操做符從文檔中刪除字段。
CREATE INDEX idx_user_id_asc ON people(user_id)
db.people.createIndex( { user_id: 1 } )
CREATE INDEX idx_user_id_asc_age_desc ON people(user_id, age DESC)
db.people.createIndex( { user_id: 1, age: -1 } )
DROP TABLE people
db.people.drop()
更多有關使用的方法和操做符的詳細信息,請參閱:
另見:
下表顯示了與向表中插入記錄相關的各類 SQL 語句以及相應的 MongoDB 語句。
INSERT INTO people(user_id, age, status) VALUES ("bcd001", 45, "A")
db.people.insertOne( { user_id: "bcd001", age: 45, status: "A" } )
有關更多信息,請參見 db.collection.insertOne()。
另見:
下表顯示了與從表中讀取記錄相關的各類 SQL 語句以及相應的 MongoDB 語句。
NOTE:find() 方法老是包含返回文檔中的
_id
字段,除非經過 projection 特別排除。 下面的一些 SQL 查詢可能包含一個_id
字段來反映這一點,即便該字段沒有包含在相應的 find() 查詢中。
SELECT user_id, status FROM people WHERE status = "A"
db.people.find( { status: "A" }, { user_id: 1, status: 1, _id: 0 } )
SELECT * FROM people WHERE age > 25 AND age <= 50
db.people.find( { age: { $gt: 25, $lte: 50 } } )
SELECT * FROM people WHERE status = "A" OR age = 50
db.people.find( { $or: [ { status: "A" } , { age: 50 } ] } )
FROM people WHERE user_id like "%bc%"
db.people.find( { user_id: /bc/ } ) -or- db.people.find( { user_id: { $regex: /bc/ } } )
SELECT * FROM people WHERE status = "A" ORDER BY user_id ASC
db.people.find( { status: "A" } ).sort( { user_id: 1 } )
SELECT COUNT(user_id) FROM people
db.people.count( { user_id: { $exists: true } } ) or db.people.find( { user_id: { $exists: true } } ).count()
SELECT DISTINCT(status) FROM people
db.people.aggregate( [ { $group : { _id : "$status" } } ] ) 或者,對於不一樣的不超過 [BSON 大小限制](https://docs.mongodb.com/manual/reference/limits/#limit-bson-document-size) 的值集 db.people.distinct( "status" )
SELECT * FROM people LIMIT 5 SKIP 10
db.people.find().limit(5).skip(10)
EXPLAIN SELECT * FROM people WHERE status = "A"
db.people.find( { status: "A" } ).explain()
有關所使用的方法的詳細信息,請參閱:
運算符(operators):
另見:
下面顯示了與更新表中現有記錄相關的各類 SQL 語句以及相應的 MongoDB 語句。
UPDATE people SET status = "C" WHERE age > 25
db.people.updateMany( { age: { $gt: 25 } }, { $set: { status: "C" } } )
UPDATE people SET age = age + 3 WHERE status = "A"
db.people.updateMany( { status: "A" } , { $inc: { age: 3 } } )
有關示例中使用的方法和運算符的詳細信息,請參閱:
另見:
下面顯示了與從表中刪除記錄相關的各類 SQL 語句以及相應的 MongoDB 語句。
DELETE FROM people WHERE status = "D"
db.people.deleteMany( { status: "D" } )
DELETE FROM people
db.people.deleteMany({})
有關更多信息,請參見 db.collection.deleteMany()。
看到這裏,想必你們應該已經將腦海中 SQL 相關的知識和 MongoDB 一一對應起來了,那麼剩下的就須要你們多多的實踐,深刻挖掘。
可是不管什麼時候,都要記住,MongoDB 官方文檔 絕對是你能找到的最權威、最全面的資料。