MongoDb 对比sql 的基础

MongoDB 是一个基于分布式文件存储的数据库。由 C++ 语言编写。旨在为 WEB 应用提供可扩展的高性能数据存储解决方案。
MongoDB 是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。
MongoDB 将数据存储为一个文档,数据结构由键值(key=>value)对组成。MongoDB 文档类似于 JSON 对象。字段值可以包含其他文档,数组及文档数组。

mongodb与mysql对比
传统的关系数据库一般由数据库(database)、表(table)、记录(record)三个层次概念组成,MongoDB是由数据库(database)、集合(collection)、文档对象(document)三个层次组成。MongoDB对于关系型数据库里的表,但是集合中没有列、行和关系概念,这体现了模式自由的特点。

MongoDB 概念解析 对比sql 来看
解释/说明 SQL术语/概念 MongoDB术语/概念
数据库 database database
数据库表/集合 table collection
数据记录行/文档 row document
数据字段/域 column field
索引 index index
主键,MongoDB自动将_id字段设置为主键 primary key primary key

一个mongodb中可以建立多个数据库。
MongoDB的默认数据库为”db”,该数据库存储在data目录中。
MongoDB的单个实例可以容纳多个独立的数据库,每一个都有自己的集合和权限,不同的数据库也放置在不同的文件中。
1.”show dbs” 命令可以显示所有数据的列表。

2.执行 “db” 命令可以显示当前数据库对象或集合。

3.使用用户名和密码连接到 MongoDB 服务器,你必须使用 ‘username:password@hostname/dbname’ 格式,’username’为用户名,’password’ 为密码。
其端口默认的27017

实际操作:
1.创建数据库 use 数据库名 如果数据库已存在的话,就会自动切换到相应的数据库
2.查看数据库 show dbs 显示所有的数据库信息,包括文档大小
需要注意的就是mogodb 中数据库表只有当你存入数据了之后你才能看到,如果集合(就是sql 中的表) 为空时,他是不显示的。这个和sql 中有区别。Sql中的空表我们也都知道是可以显示的。 mongodb 默认的数据库为test,如果没有创建数据库 集合将存放在test 数据库中
3.删除数据库 db.dropDatabase() 该命令就是执行删除当前数据库命令。
如果删除其他数据库怎么办? 这就用到前面刚提到的,使用show dbs 查看所有数据库信息,然后使用use 数据库名的方式 切换到要删除的数据库,然后再执行删除数据库操作,最后再使用show dbs 查看是否删除成功。

以上是对数据库的操作,大家都知道实际开发中我们更多的操作的是sql中称之为表
Mogodb 中称之 为集合。
既然刚上面提到了删除,那么我们看看mongodb 中集合删除的的命令
1.删除集合 db.集合名称.drop() 同样的思路:我们用show dbs 查看所有集合
然后执行db.集合名称.drop() 最后使用show dbs 来检查是否删除成功。
2.查看集合 从删除集合中其实大家都能注意到 show dbs 就是查看的命令
mongodb 中插入文档的数据结构和json 差不多一样,所有存储在集合中的数据都是以Boson的形式存在 。Boson 是一种类json 的二进制存储形式。
1.插入文档 insert() 或 save() 方法向集合中插入文档 具体操作:
db.集合名称.insert(document) 实例:db.集合名.insert(
{
title: ‘MongoDB插入’,
description: ‘MongoDB 是一个 Nosql 数据库’,
by: ‘测测’,
url: ‘www.baidu.com’,
tags: [‘mongodb’, ‘database’, ‘NoSQL’],
likes: 100
}
)
如果上述命令中集合名称已经存在,则会往已经存在的集合中插入文档 ,如果集合名称不存,他就会自动创建 该集合 并插入文档。既然insert()和save() 都是执行插入,那有啥区别呢?什么时候用save()
插入文档你也可以使用 db.col.save(document) 命令。如果不指定 _id 字段 save() 方法类似于 insert() 方法。如果指定 _id 字段,则会更新该 _id 的数据。
3.2 版本以后又多了几个插入的方法
db.collection.insertOne():向指定集合中插入一条文档数据
db.collection.insertMany():向指定集合中插入多条文档数据

插入单条数据

var document = db.collection.insertOne({“a”: 3})
document
{
“acknowledged” : true,
“insertedId” : ObjectId(“571a218011a82a1d94c02333”)
}

插入多条数据

var res = db.collection.insertMany([{“b”: 3}, {‘c’: 4}])
res
{
“acknowledged” : true,
“insertedIds” : [
ObjectId(“571a22a911a82a1d94c02337”),
ObjectId(“571a22a911a82a1d94c02338”)
]
}

2.更新文档 可以使用update() 和save() 方法来更新文档
Update() 用于更新已存在的的文档 格式:
db.集合名.update(
, update的查询条件,类似sql update查询内where后面的
, update的对象和一些更新的操作符(如 , inc…)等,也可以理解为sql update查询内set后面的
{
upsert: ,可选,这个参数的意思是,如果不存在update的记录,是否插入objNew,true为插入,默认是false,不插入
multi: ,multi : 可选,mongodb 默认是false,只更新找到的第一条记录,如果这个参数为true,就把按条件查出来多条记录全部更新。
writeConcern :可选,抛出异常的级别。
writeConcern:
}
)

这里顺便说下incset 修改器区别, inc inc只能用于整数、长整数和双精度浮点数

save() 方法通过传入的文档来替换已有文档 啥意思呢?就是相当于sql 中我直接把一列数据都给他替换了。

3.删除文档 remove()函数是用来移除集合中的数据。由于是非关系型数据库,所以除了_id不一样之外 其余的都都有可能一样,所以再移除某些数据之前一定要执行find() 操作,然后按照严格的条件来执行删除操作
移除操作的命令格式:
db.collection.remove(
, (可选)删除的文档的条件。
{
justOne: , (可选)如果设为 true 或 1,则只删除一个文档。
writeConcern: (可选)抛出异常的级别。
}
)
如: db.ceshi.remove({a:3})
如果想删除全部数据 db.ceshi.remove({}) 即可
4.查询文档 查询方法使用find() 语句结构:
db.collection.find(
query,可选,使用查询操作符指定查询条件
projection 可选,使用投影操作符指定返回的键 。如果你需要以易读的方式来读取数据,可以使用 pretty() 方法
)
find() 方法之外,还有一个 findOne() 方法,它只返回一个文档。
除此之外,find()方法还可以传入多个键 ,每个键都以逗号隔开
如:db.collection.find({key1:value1,key2:value2}) 就类似于 sql 中的and。有了and 当然少不了OR, 语法格式:db.collection.find({or:[{key1:value1},{key2:value2}]})  
有了OR 那么肯定少不了AND 和OR的联合使用。  
类似与:where likes>50 and  (name=’测试’ or sex=’男’) mongodb 中的语法形式:db.collection.find({“likes”:{
gt:50},$or:[{“name”:”测试”},{“sex”:’男’}]})

MONGODB的操作运算符
1.常用的条件运算符 1. gt>2. lt 小于 < 3.>= 大于等于 4.小于等于<= 5. ne=6. eq 等于 =

如果想查询某个属性大于某一个数且又小于另一个数
在sql 中Select * from col where likes>100 AND likes<200;
在mongodb 中的语法:
db.collection.find({likes : { lt:200, gt : 100}})

2. typeBSONmongodb使Double1String2Object3Array4Binarydata5Undefined6Objectid7Boolean8Date9Null10RegularExpression11JavaScript13Symbol14JavaScript(withscope)1532bitinteger16Timestamp1764bitinteger18Minkey255Querywith1.Maxkey127 type的操作的符的目的就是获取比如说:想获取对象中某个属性是字符串的数据
db.collection.find({“title” : {type : 2}})  
说完
type 再说下sql 中我们 sql 中经常用到的
3.limit 方法,同样的在mongodb 中也一样适用语法格式:
db.collection.find({“key1”:1,”id”:2}).limit(2);
如果通过limit 出来 其实还有个
4.skip()方法配合使用,感觉平时也用的不多,就不做过多解释了。
说完limit 自然就会想到排序 我们都知道在sql 中我们有asc 和desc两个关键字用来做排序。当然在mongodb 中一样也有自己的关键字 也很好理解sort。
5. sort()方法对数据进行排序,sort()方法可以通过参数指定排序的字段,并使用 1 和 -1 来指定排序的方式,其中 1 为升序排列,而-1是用于降序排列。
基本语法:db.collection.find().sort({属性名称:1或者-1});
讲完排序自然就少不了
6.索引 (ensureIndex() ),上次也说过索引的好处了,这里就直接上语法格式:db.collection.ensureIndex({key:1}) key 就是你需要创建索引的字段,1为指定升序 -1为降序。ensureIndex() 同时可以为多个字段创建索引 sql 中我们称之为复合索引。在ensureIndex()中还有多个参数可以选择。
Parameter Type Description
background Boolean 建索引过程会阻塞其它数据库操作,background可指定以后台方式创建索引,即增加 “background” 可选参数。 “background” 默认值为false。
unique Boolean 建立的索引是否唯一。指定为true创建唯一索引。默认值为false.
name string 索引的名称。如果未指定,MongoDB的通过连接索引的字段名和排序顺序生成一个索引名称。
dropDups Boolean 在建立唯一索引时是否删除重复记录,指定 true 创建唯一索引。默认值为 false.
sparse Boolean 对文档中不存在的字段数据不启用索引;这个参数需要特别注意,如果设置为true的话,在索引字段中不会查询出不包含对应字段的文档.。默认值为 false.
expireAfterSeconds integer 指定一个以秒为单位的数值,完成 TTL设定,设定集合的生存时间。
v index version 索引的版本号。默认的索引版本取决于mongod创建索引时运行的版本。
weights document 索引权重值,数值在 1 到 99,999 之间,表示该索引相对于其他索引字段的得分权重。
default_language string 对于文本索引,该参数决定了停用词及词干和词器的规则的列表。 默认为英语
language_override string 对于文本索引,该参数指定了包含在文档中的字段名,语言覆盖默认的language,默认值为 language.

说完上面常用的方法,再说说常用的函数
1.聚合aggregate() 使用语法:db.collection.aggregate(),其实和我们sql 中的count()有些相似。一些常用的聚合表达式

表达式 描述 实例
sumdb.mycol.aggregate([$group:id:"$byuser",numtutorial:$sum:"$likes]) avg 计算平均值 db.mycol.aggregate([{group : {_id : "$by_user", num_tutorial : {$avg : "$likes”}}}])min 获取集合中所有文档对应值得最小值。 db.mycol.aggregate([{group : {_id : "$by_user", num_tutorial : {$min : "$likes”}}}])max 获取集合中所有文档对应值得最大值。 db.mycol.aggregate([{group : {_id : "$by_user", num_tutorial : {$max : "$likes”}}}])push 在结果文档中插入值到一个数组中。 db.mycol.aggregate([{group : {_id : "$by_user", url : {$push: "$url”}}}])addToSet 在结果文档中插入值到一个数组中,但不创建副本。 db.mycol.aggregate([{group : {_id : "$by_user", url : {$addToSet : "$url”}}}])first 根据资源文档的排序获取第一个文档数据。 db.mycol.aggregate([{group : {_id : "$by_user", first_url : {$first : "$url”}}}])last 根据资源文档的排序获取最后一个文档数据 db.mycol.aggregate([{group : {_id : "by_user", last_url : { last:" url”}}}])

除此之外 Mongodb 还有一些管道操作,管道就是指把当前命令的结果作为下一个命令的参数。关于管道符操做的简单举几个例子:
project match:用于过滤数据,只输出符合条件的文档。 match使MongoDB limit:用来限制MongoDB聚合管道返回的文档数。
skip unwind:将文档中的某一个数组类型字段拆分成多条,每条包含数组中的一个值。
group sort:将输入文档排序后输出。
$geoNear:输出接近某一地理位置的有序文档。

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值