MongoDB 与 SQL 类比记录

MongoDB 简述

本文记录MongoDB关系型数据库(Relational database)1的对比学习总结,会 源源不断 地更新。

文章中有错误或不足之处,欢迎留言指正,感谢!

MongoDB是面向文档(document)2存储的非关系型数据库,由键值对构成,文档不需要具有相同的字段、类型和大小,因此相比关系型数据库更灵活,MongoDB不具备关系型数据库一些的功能,如JOIN、复杂的多行事务。

基本结构对比

SQLMongo解释/说明
databasedatabase数据库
tablecollection数据库表 / 集合
rowdocument记录行 / 文档
columnfield字段 / 域
indexindex索引
table joins$lookup表连接 ,多表查询(3.2新增)
primary keyprimary key主键

数据库(database)操作

创建数据库

use database_name

数据库不存在时,创建数据库,若存在,则切换到该数据库

show dbs

查看所有数据库

删除数据库

db.dropDatabase()

删除当前数据库,默认删除test

集合(collection)操作

创建集合

db.createCollection(name, options)

name:集合名
options:可选参数,指定内存大小和索引。可省略
后续对options各项参数进行补充说明

show collections

查看所有集合

db.collection.insert({"name": "零否"})

插入文档时,若集合不存在,将会自动创建集合

删除集合

db.collection.drop()

删除成功将返回 true ,否则返回 false

文档(document)操作

MongoDB中,文档为Bson格式,二进制的JSON格式。
{} 为整体,填充键值对,逗号分隔;
或以 [] 为整体, 填充文档,逗号分隔。

增(insert)

db.collection.insert( document )
db.collection.insertOne( document ) #插入一条文档
db.collection.insertMany( [document 1, document 2,···] ) #插入多条文档

例:

db.collection.insert( { "name": "零否" } )
db.clooection.insertOne( { "name": "零否", "id": 100} )
db.clooection.insertMany( [ { "name": "零否",  "id": 100 },
					      { "name": "零否2", "id": 200, "age": 18 } ] )

待续···

删(remove)

db.collection.remove( query, 
					{ justOne: boolean, 
					  writeConcern: document } )

query : 删除文档的条件
justOne : (可选)默认为false,设置为 ture1,表示只删除查询到的第一条文档
writeConcern :(可选)抛出异常的级别

例:

db.collection.remove({"name": "零否"})

改(update)

db.collection.update( query,  update,
				 	{ upsert: boolean,
				  	  multi: boolean, 
				  	  writeConcern: document} )

query : update的查询条件,类似sql update查询内where后面的。
update : update的对象和一些更新的操作符(如$,$set,$inc…)等,也可以理解为sql update查询内set后面的
upsert : 可选,这个参数的意思是,如果不存在update的记录,是否插入新文档,true为插入,默认是false,不插入。
multi : 可选,mongodb 默认是false,只更新找到的第一条记录,如果这个参数为true,就把按条件查出来多条记录全部更新。
writeConcern :可选,抛出异常的级别。

例:

  • 只更新第一条记录:
db.collection.update( { "name": "零否" }, { $set: { "name": "123" } } )
  • 全部更新
db.collection.update( { "count" : { $gt : 3 } } ,
				 { $set : { "status" : "OK"} },false,true );

db.collection.update( { "count" : { $gt : 3 } } ,
				 { $set : { "status" : "OK"} },{ multi : true } );
  • 只添加第一条:
db.collection.update( { "count" : { $gt : 4 } } ,
				 { $set : { "status" : "OK"} },true,false );
  • 全部添加进去:
db.collection.update( { "count" : { $gt : 5 } } , 
				{ $set : { "status" : "OK"} },true,true );

"$inc“修改器用来增加已有键的值,或者在键不存在时创建一个键。$inc就是专门来增加(和减少)数字的。”$inc"只能用于整数、长整数或双精度浮点数。要是用在其他类型的数据上就会导致操作失败。

  • 全部更新:
db.col.update( { "count" : { $gt : 15 } } , 
				{ $inc : { "count" : 1} },false,true );

count值加1

  • 只更新第一条记录:
db.col.update( { "count" : { $gt : 10 } } ,
				 { $inc : { "count" : -1} },false,false );

count值减1

待续···

查(find)

MongoDB中使用find()方法查询文档
find()非结构化方式展示文档
find().pretty()结构化方式展示文档

db.collection.find( query, projection )

query3 :可选,使用查询操作符指定查询条件
projection4 :可选,使用投影操作符指定返回的键。查询时返回文档中所有键值, 只需省略该参数即可(默认省略)。

下文简单介绍Mongo关系数据库管理系统的类比(RDBMS),即Mysql,SQL Server,IBM DB2等等

基本条件查询类比一

操作格式MongoRDBMS
1()db.collection.find()select * from collection
2({},{key:1})db.collection.find({}, {“name”:“零否”})select * from collection where name = “零否”
3({key1: value}, {key2: 1})db.collection.find({“name”:“零否”}, {"id":1})select id from collection where name = “零否”

{"id":1}: 值为0时,表示不显示该域(字段),为1时表示显示该域

条件查询类比二(=、!=、>、<、>=、<=)

操作格式MongoRDBMS
等于 =({key:value})db.collection.find({"name":"零否"})select * from collection where name = "零否"
不等于 !=({key:{$ne:value}})db.collection.find({"id":{$ne:10}})select * from collection where id != 10
大于 >({key:{$gt:value}})db.collection.find({"id":{$gt:10}})select * from collection where id > 10
小于 <({key:{$lt:value}})db.collection.find({"id":{$lt:10}})select * from collection where id <10
大于等于>=({key:{$gte:value}}))db.collection.find({"id":{$gte:10}})select * from collection where id >= 10
小于等于<=({key:{$lte:value}})db.collection.find({"id":{$lte:10}})select * from collection where id <= 10

条件查询类比三(and、or)

操作格式MongoRDBMS
and({key1:value1, key2:value2})db.collection.find({"name":"零否", "id":"0607"})select * from collection where name = "零否" AND id = "0607"
~~~~~~({$and:[{key1:value}, {key2:value}]})db.collection.find({$and:[{"name":"零否"}, {"id":"0607"}]})select * from collection where name = "零否" AND id = "0607"
👆鸡肋👆鸡肋👆👆鸡肋👆鸡肋👆
or({$or:[{key1:value}, {key2:value}]})db.collection.find({$or:[{"name":"零否"},{"id":"0607"}]})select * from collection where name = "零否" OR id = "0607"
👆好用👆好用👆👆 好用👆好用👆
and和or混合使用

db.collection.find({"number": {$lte:100}, $or:[{"name":"零否"}, {"id":"0607"}]})

等同于

select * from collection where number <= 100 OR name = "零否" AND id = "0607"

未完待续~~~


  1. 关系型数据库:即MySQL、DB2、SQL Server、Oracel等 ↩︎

  2. 文档, BSON格式,类JSON,即Binary,Json ↩︎

  3. query: 条件, BSON格式 ↩︎

  4. projection:查询时返回文档的所有键值,BSON 格式 ↩︎

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值