很多开发者首次接触数据库(通常是在高校课堂)的概念,或者说接触第一个数据库,通常是 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 术语和概念.

TIP

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

Executables

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

Examples

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

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

Create and Alter

CREATE TABLE

  • SQL 模式语句:
CREATE TABLE people (
id MEDIUMINT NOT NULL
AUTO_INCREMENT,
user_id Varchar(30),
age Number,
status char(1),
PRIMARY KEY (id)
)
  • MongoDB 模式语句:
db.people.insertOne( {
user_id: "abc123",
age: 55,
status: "A"
} )

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

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

db.createCollection("people")

ALTER TABLE / ADD

  • SQL模式语句:
ALTER TABLE people
ADD join_date DATETIME
  • MongoDB 模式语句:
db.people.updateMany(
{ },
{ $set: { join_date: new Date() } }
)

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

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

ALTER TABLE / DROP COLUMN

  • SQL模式语句:
ALTER TABLE people
DROP COLUMN join_date
  • MongoDB 模式语句:
db.people.updateMany(
{ },
{ $unset: { "join_date": "" } }
)

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

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

CREATE INDEX

  • SQL 模式语句:
CREATE INDEX idx_user_id_asc
ON people(user_id)
  • MongoDB 模式语句:
db.people.createIndex( { user_id: 1 } )

CREATE INDEX / Multi

  • SQL模式语句:
CREATE INDEX
idx_user_id_asc_age_desc
ON people(user_id, age DESC)
  • MongoDB 模式语句:
db.people.createIndex( { user_id: 1, age: -1 } )

DROP TABLE

  • SQL模式语句:
DROP TABLE people
  • MongoDB 模式语句:
db.people.drop()

Insert

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

  • SQL INSERT 语句
INSERT INTO people(user_id,
age,
status)
VALUES ("bcd001",
45,
"A")
  • Mongodb insertOne() 语句
db.people.insertOne(
{ user_id: "bcd001", age: 45, status: "A" }
)

Select

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

NOTE:

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

SELECT ... WHERE

  • SQL 语句

SELECT user_id, status
FROM people
WHERE status = "A"
  • Mongodb 语句
db.people.find(
{ status: "A" },
{ user_id: 1, status: 1, _id: 0 }
)

SELECT ... AND

  • SQL 语句
SELECT *
FROM people
WHERE age > 25
AND age <= 50
  • Mongodb 语句
db.people.find(
{ age: { $gt: 25, $lte: 50 } }
)

SELECT ... OR

  • SQL 语句
SELECT *
FROM people
WHERE status = "A"
OR age = 50
  • Mongodb 语句
db.people.find(
{ $or: [ { status: "A" } , { age: 50 } ] }
)

SELECT ... LIKE

  • SQL 语句
FROM people
WHERE user_id like "%bc%"
  • Mongodb 语句
db.people.find( { user_id: /bc/ } )

-or-

db.people.find( { user_id: { $regex: /bc/ } } )

SELECT ... OEDER BY

  • SQL 语句
SELECT *
FROM people
WHERE status = "A"
ORDER BY user_id ASC
  • Mongodb 语句
db.people.find( { status: "A" } ).sort( { user_id: 1 } )

SELECT ... COUNT

  • SQL 语句
SELECT COUNT(user_id)
FROM people
  • Mongodb 语句
db.people.count( { user_id: { $exists: true } } )

or

db.people.find( { user_id: { $exists: true } } ).count()

SELECT DISTINCT

  • SQL 语句
SELECT DISTINCT(status)
FROM people
  • Mongodb 语句

db.people.aggregate( [ { $group : { _id : "$status" } } ] )

或者,对于不同的不超过 [BSON 大小限制](https://docs.mongodb.com/manual/reference/limits/#limit-bson-document-size) 的值集

db.people.distinct( "status" )

SELECT ... LIMIT SKIP

  • SQL 语句
SELECT *
FROM people
LIMIT 5
SKIP 10
  • Mongodb 语句
db.people.find().limit(5).skip(10)

EXPLAIN SELECT

  • SQL 语句
EXPLAIN SELECT *
FROM people
WHERE status = "A"
  • Mongodb 语句
db.people.find( { status: "A" } ).explain()

Update Records

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

UPDATE ... SET

  • SQL 语句
UPDATE people
SET status = "C"
WHERE age > 25
  • Mongodb 语句
db.people.updateMany(
{ age: { $gt: 25 } },
{ $set: { status: "C" } }
)

UPDATE ... INC

  • SQL 语句
UPDATE people
SET age = age + 3
WHERE status = "A"
  • Mongodb 语句
db.people.updateMany(
{ status: "A" } ,
{ $inc: { age: 3 } }
)

Delete Records

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

DELETE WHERE

  • SQL 语句
DELETE FROM people
WHERE status = "D"
  • Mongodb 语句
db.people.deleteMany( { status: "D" } )

DELETE

  • SQL 语句
DELETE FROM people
  • Mongodb 语句
db.people.deleteMany({})

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

从 SQL 到 MongoDB,这一篇就够了的更多相关文章

  1. mongoDB看这篇就够了

    写在前面 hello,小伙伴们,我是 pubdreamcc ,本篇文章依旧出至于我的 GitHub仓库 node学习教程 ,如果你觉得我写的还不错,欢迎给个 star ,小伙伴们的 star 是我持续 ...

  2. MongoDB基础一篇就够了

    MongoDB linux安装MongoDB Windows安装MongoDB 查看当前数据库名称 db 查看所有数据库名称 列出所有在物理上存在的数据库 show dbs 切换数据库 如果数据库不存 ...

  3. MongoDB【第一篇】MongodDB初识

    NoSQL介绍 一.NoSQL简介 NoSQL,全称是”Not Only Sql”,指的是非关系型的数据库. 非关系型数据库主要有这些特点:非关系型的.分布式的.开源的.水平可扩展的. 原始的目的是为 ...

  4. 了解 MongoDB 看这一篇就够了【华为云技术分享】

    版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/devcloud/article/detai ...

  5. 了解 MongoDB 看这一篇就够了【华为云分享】

    目录 一.简介 二.基本模型 BSON 数据类型 分布式ID 三.操作语法 四.索引 索引特性 索引分类 索引评估.调优 五.集群 分片机制 副本集 六.事务与一致性 一致性 小结 一.简介 Mong ...

  6. 从0开始搭建SQL Server AlwaysOn 第三篇(配置AlwaysOn)

    从0开始搭建SQL Server AlwaysOn 第三篇(配置AlwaysOn) 第一篇http://www.cnblogs.com/lyhabc/p/4678330.html第二篇http://w ...

  7. 从0开始搭建SQL Server AlwaysOn 第四篇(配置异地机房节点)

    从0开始搭建SQL Server AlwaysOn 第四篇(配置异地机房节点) 第一篇http://www.cnblogs.com/lyhabc/p/4678330.html第二篇http://www ...

  8. MongoDB【第二篇】集群搭建

    第一步:准备 1.安装包 mongodb-linux-x86_64-rhel70-3.4.2.tgz 2. 架构: 本文为 1-primary.1-secondary.1-arbiter 的 mong ...

  9. SQL数据库基础知识-巩固篇<一>

    SQL数据库基础知识-巩固篇<一>... =============== 首先展示两款我个人很喜欢的数据库-专用于平时个人SQL技术的练习<特点:体积小,好安装和好卸载,功能完全够用 ...

随机推荐

  1. 混部之殇-论云原生资源隔离技术之CPU隔离(一)

    作者 蒋彪,腾讯云高级工程师,10+年专注于操作系统相关技术,Linux内核资深发烧友.目前负责腾讯云原生OS的研发,以及OS/虚拟化的性能优化工作. 导语 混部,通常指在离线混部(也有离在线混部之说 ...

  2. 【.NET 与树莓派】六轴飞控传感器(MPU 6050)

    所谓"飞控",其实是重力加速度计和陀螺仪的组合,因为多用于控制飞行器的平衡(无人机.遥控飞机).有同学会问,这货为什么会有六轴呢?咱们常见的不是X.Y.Z三轴吗?重力加速度有三轴, ...

  3. back_insert_iterator和insert_iterator

    #include <iostream> #include <string> #include <iterator> #include <vector> ...

  4. 2020BUAA-个人博客-案例分析

    个人博客作业-软件案例分析 项目 内容 北航2020软工 班级博客 作业要求 具体要求 我的课程目标 通过案例分析提升自己对于软件工程的认识 课程收获 分析软件,了解软件的定位 第一部分 调研,评测( ...

  5. JS中函数定义和使用顺序

    在js中如果定义函数是先声明函数,如: console.log(hello); //然后再去定义: function hello(){ alert("Hello");} 这种是可以 ...

  6. C++PRIMER第五版练习题答案第一章

    C++PRIMER第五版练习题答案第一章 应该有很多小伙伴和我一样,闲来无事买了本C++的书自己啃,课后的练习题做的很揪心,这里我分享下我写的答案,希望能帮助到你,提供源码,就不跑了哈,毕竟现在是第一 ...

  7. 从零搭建springboot服务03-redis消息订阅

    愿历尽千帆,归来仍是少年 1.所需依赖 <!-- Redis依赖 --> <dependency> <groupId>org.springframework.boo ...

  8. 下载最新版本Fiddler

    下载最新版本Fiddler https://www.telerik.com/download/fiddler/fiddler-everywhere-windows

  9. [web] 虚拟机网络设置

    三种模式 桥接(Bridged):主机网卡--虚拟网桥--虚拟机网卡,把主机虚拟为交换机,虚拟机ip需与主机设置在同一网段,网关与DNS与主机网卡一致 地址转换(NAT):主机网卡--虚拟NAT设备- ...

  10. 第3期:Too many open files以及ulimit的探讨

    第3期:Too many open files以及ulimit的探讨 毛帅 Java.AI.互联网.金融 10 人赞同了该文章 Too many open files是Java常见的异常,通常是由于系 ...