下载安卓APP箭头
箭头给我发消息

客服QQ:3315713922

数据库从SQL到MongoDB

作者:java互联网架构     来源: 今日头条点击数:740发布时间: 2020-03-23 21:11:26

标签: 数据库开发MySQL

从SQL到mongodb,这一篇就够了。数据库(Database)是按照 数据结构来组织、 存储和管理数据的建立在计算机存储设备上的仓库。

简单来说是本身可视为 电子化的文件柜——存储电子 文件的处所,用户可以对文件中的数据进行新增、截取、更新、删除等操作。

对于 SQL 转战 NoSQL的开发人员来说,最难的一步其实是将原有的 SQL 的概念和知识直接复用过来,最大化的减小学习的成本。

【金融特辑】光大银行科技部DBA女神带你从0到1揭秘MGR

前言

很多开发者首次接触数据库(通常是在高校课堂)的概念,或者说接触第一个数据库,通常是 SQL 数据库,而现在,NoSQL 数据库后来居上,很多原 SQL 数据的使用者难免有转向 NoSQL 的需求。而作为 NoSQL 数据库的代表,MongoDB 在社区越来越流行,生产环境的使用也日益广泛。

对于 SQL 转战 NoSQL的开发人员来说,最难的一步其实是将原有的 SQL 的概念和知识直接复用过来,最大化的减小学习的成本。

其实,这一步 MongoDB 官方已经为大家考虑到了,那就是在:MongoDB CRUD Operations > MongoDB CRUD Operations > SQL to MongoDB Mapping Chart,这篇文档非常好的总结了 SQL 对应 MongoDB 的术语和概念,还有可执行文件、SQL 语句/MongoDB 语句等,

可以说对于 SQL 数据库开发人员,如果理解了他们之间的对应关系,那么就一只脚就迈进了 MongoDB 的大门。

Terminology and Concepts

下表介绍了各种 SQL 术语和概念以及相应的 MongoDB 术语和概念.

数据库从SQL到MongoDB_数据库_数据存储_MySQL_课课家

TIP

在许多情况下, 非规范化数据模型(嵌入式文档和数组) denormalized data model (embedded documents and arrays) 将继续是您数据和用例的最佳选择,而不是多文档事务. 也就是说,对于许多场景,对数据进行适当的建模将最大限度地减少对 多文档事务(multi-document transactions)的需求。

Executables

下表显示了一些数据库可执行文件和相应的 MongoDB 可执行文件。 这张表并不是详尽无遗的。

Examples

下表显示了各种 SQL 语句和相应的 MongoDB 语句。 表中的例子假定以下条件:

  • Sql 示例假设一个名为 people 的表。
  • MongoDB 的示例假定一个名为 people 的集合包含以下原型的文档:
  1.   _id: ObjectId("509a8fb2f3f4948bd2f983a0"), 
  2.   user_id: "abc123"
  3.   age: 55, 
  4.   status: 'A' 

Create and Alter

CREATE TABLE

SQL 模式语句:

  1. CREATE TABLE people ( 
  2.     id MEDIUMINT NOT NULL 
  3.         AUTO_INCREMENT, 
  4.     user_id Varchar(30), 
  5.     age Number, 
  6.     status char(1), 
  7.     PRIMARY KEY (id) 

MongoDB 模式语句:

  1. db.people.insertOne( { 
  2.     user_id: "abc123"
  3.     age: 55, 
  4.     status: "A" 
  5.  } ) 

在第一个 insertOne() 或 insertMany() 操作上隐式创建。 如果没有指定 _id 字段,则自动添加主键 _id。

但是,您也可以显式地创建一个集合:

  1. db.createCollection("people"

ALTER TABLE / ADD

SQL模式语句:

  1. ALTER TABLE people 
  2. ADD join_date DATETIME 

MongoDB 模式语句:

  1. db.people.updateMany( 
  2.     { }, 
  3.     { $set: { join_date: new Date() } } 

集合不描述或强制执行其文档的结构;也就是说,在集合级别上没有结构上的改变。

但是,在文档级别,updateMany() 操作可以使用 $set 操作符向现有文档添加字段。

ALTER TABLE / DROP COLUMN

SQL模式语句:

  1. ALTER TABLE people 
  2. DROP COLUMN join_date 

MongoDB 模式语句:

  1. db.people.updateMany( 
  2.     { }, 
  3.     { $unset: { "join_date""" } } 

集合不描述或强制执行其文档的结构;也就是说,在集合级别上没有结构上的改变。

但是,在文档级别,updateMany() 操作可以使用 $unset 操作符从文档中删除字段。

CREATE INDEX

SQL 模式语句:

  1. CREATE INDEX idx_user_id_asc 
  2. ON people(user_id) 

MongoDB 模式语句:

  1. db.people.createIndex( { user_id: 1 } ) 

CREATE INDEX / Multi

SQL模式语句:

  1. CREATE INDEX idx_user_id_asc_age_descON people(user_id, age DESC

MongoDB 模式语句:

  1. db.people.createIndex( { user_id: 1, age: -1 } ) 

DROP TABLE

SQL模式语句:

  1. DROP TABLE people 

MongoDB 模式语句:

  1. db.people.drop() 

Insert

下表显示了与向表中插入记录相关的各种 SQL 语句以及相应的 MongoDB 语句。

SQL INSERT 语句

  1. INSERT INTO people(user_id, 
  2.                   age, 
  3.                   status) 
  4. VALUES ("bcd001"
  5.         45, 
  6.         "A"

Mongodb insertOne() 语句

  1. db.people.insertOne( 
  2.    { user_id: "bcd001", age: 45, status: "A" } 

Select

下表显示了与从表中读取记录相关的各种 SQL 语句以及相应的 MongoDB 语句。

NOTE:

  • find() 方法总是包含返回文档中的 _id 字段,除非通过 projection 特别排除。 下面的一些 SQL 查询可能包含一个 _id 字段来反映这一点,即使该字段没有包含在相应的 find() 查询中。

SELECT ... WHERE

SQL 语句

  1. SELECT user_id, status 
  2. FROM people 
  3. WHERE status = "A" 

Mongodb 语句

  1. db.people.find( 
  2.     { status: "A" }, 
  3.     { user_id: 1, status: 1, _id: 0 } 

SELECT ... AND

SQL 语句

  1. SELECT * 
  2. FROM people 
  3. WHERE age > 25 
  4. AND   age <= 50 

Mongodb 语句

  1. db.people.find( 
  2.    { age: { $gt: 25, $lte: 50 } } 

SELECT ... OR

SQL 语句

  1. SELECT * 
  2. FROM people 
  3. WHERE status = "A" 
  4. OR age = 50 

Mongodb 语句

  1. db.people.find( 
  2.     { $or: [ { status: "A" } , { age: 50 } ] } 

SELECT ... LIKE

SQL 语句

  1. FROM people 
  2. WHERE user_id like "%bc%" 

Mongodb 语句

  1. db.people.find( { user_id: /bc/ } )  
  2. -or-  
  3. db.people.find( { user_id: { $regex: /bc/ } } ) 

SELECT ... OEDER BY

SQL 语句

  1. SELECT * 
  2. FROM people 
  3. WHERE status = "A" 
  4. ORDER BY user_id ASC 

Mongodb 语句

  1. db.people.find( { status: "A" } ).sort( { user_id: 1 } ) 

SELECT ... COUNT

SQL 语句

  1. SELECT COUNT(user_id) 
  2. FROM people 

Mongodb 语句

  1. db.people.count( { user_id: { $exists: true } } )  
  2. or  
  3. db.people.find( { user_id: { $exists: true } } ).count() 

SELECT DISTINCT

SQL 语句

  1. SELECT DISTINCT(status) 
  2. FROM people 

Mongodb 语句

  1. db.people.aggregate( [ { $group : { _id : "$status" } } ] ) 
  2.  
  3. 或者,对于不同的不超过 [BSON 大小限制](https://docs.mongodb.com/manual/reference/limits/#limit-bson-document-size) 的值集 
  4.  
  5. db.people.distinct"status" ) 

SELECT ... LIMIT SKIP

SQL 语句

  1. SELECT * 
  2. FROM people 
  3. LIMIT 5 
  4. SKIP 10 

Mongodb 语句

  1. db.people.find().limit(5).skip(10) 

EXPLAIN SELECT

SQL 语句

  1. EXPLAIN SELECT * 
  2. FROM people 
  3. WHERE status = "A" 

Mongodb 语句

  1. db.people.find( { status: "A" } ).explain() 

Update Records

下面显示了与更新表中现有记录相关的各种 SQL 语句以及相应的 MongoDB 语句。

UPDATE ... SET

SQL 语句

  1. UPDATE people 
  2. SET status = "C" 
  3. WHERE age > 25 

Mongodb 语句

  1. db.people.updateMany( 
  2.    { age: { $gt: 25 } }, 
  3.    { $set: { status: "C" } } 

UPDATE ... INC

SQL 语句

  1. UPDATE people 
  2. SET age = age + 3 
  3. WHERE status = "A" 

Mongodb 语句

  1. db.people.updateMany( 
  2.    { status: "A" } , 
  3.    { $inc: { age: 3 } } 

Delete Records

下面显示了与从表中删除记录相关的各种 SQL 语句以及相应的 MongoDB 语句。

DELETE WHERE

SQL 语句

  1. DELETE FROM peopleWHERE status = "D" 

Mongodb 语句

  1. db.people.deleteMany( { status: "D" } ) 

DELETE

SQL 语句

  1. DELETE FROM people 

Mongodb 语句

  1. db.people.deleteMany({}) 

看到这里,想必大家应该已经将脑海中 SQL 相关的知识和 MongoDB 一一对应起来了,那么剩下的就需要大家多多的实践,深入挖掘。

严格来说,数据库是长期储存在计算机内、有组织的、可共享的数据集合。数据库中的数据指的是以一定的数据模型组织、描述和储存在一起、具有尽可能小的冗余度、较高的数据独立性和易扩展性的特点并可在一定范围内为多个用户共享。

赞(8)
踩(0)
分享到:
华为认证网络工程师 HCIE直播课视频教程