MongoDB介绍
MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。它支持的数据结构非常松散,因此可以存储比较复杂的数据类型。Mongo最大的特点是它支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引。
MongoDB特点
-
1 面向集合(Collenction-Orented)
- 意思是数据被分组存储在数据集中, 被称为一个集合(Collenction)。每个集合在数据库中都有一个唯一的标识名,并且可以包含无限数目的文档。集合的概念类似关系型数据库里的表(table),不同的是它不需要定义任何模式(schema)
-
2 模式自由(schema-free)
- 意味着对于存储在 MongoDB 数据库中的文件,我们不需要知道它的任何结构定义。提了这么多次"无模式"或"模式自由",它到是个什么概念呢?例如,下面两个记录可以存在于同一个集合里面: {"welcome" : "Beijing"} {"age" : 25}
-
3 文档型
- 意思是我们存储的数据是键-值对的集合,键是字符串,值可以是数据类型集合里的任意类型,包括数组和文档. 我们把这个数据格式称作 “BSON” 即 “Binary Serialized document Notation.”
MongoDB概念解析
MongoDB中基本的概念是文档、集合和数据库
MongoDB三要素
- 数据库:一个集合的物理容器,一个数据库可以包含多个文档(一个服务器通常有多个数据库)。
- 集合:类似于关系型数据库中的表,集合存在于数据库中,集合没有固定的结构,这意味着你在对集合可以插入不同格式和类型的数据,但通常情况下我们插入集合的数据都会有一定的关联性。
- 文档:就是关系型数据库中的一行。文档是一个对象,由键值对构成,是json的扩展形式
MongoDB数据类型
String:字符串,必须是有效的UTF-8Boolean:存储一个布尔值,true或者falseInteger:整数可以是32位或64位,这取决于服务器Double:存储浮点数Arrays:数组或列表Object:嵌入式文档Null:存储Null值Timestamp:时间戳, 表示从1970-1-1到现在的总秒数Object ID是一个12字节的十六进制数
MongoDB操作
数据库操作
创建数据库
#如果数据库不存在,则会创建数据库,否则切换到指定数据库
use d1 # 创建d1数据库
删除数据库
#删除当前数据库,默认为 test,你可以使用 db 命令查看当前数据库名。
db.dropDatabase()
查看数据库
#查看数据库
show dbs
集合操作
创建集合
db.createCollection(name,options)
# name: 要创建的集合名称
# options: 可选参数, 指定有关内存大小及索引的选项
db.createCollection('t1')
options参数如下:
db.createCollection("t2", { capped : true, size :
6142800, max : 10000 } )
注意:这里的options是以字典形式插入
删除集合
# 如果成功删除选定集合,则 drop() 方法返回 true,否则返回 false。
db.collection.drop()
查看集合
show collections
文档操作
插入文档
#db.集合名.insert(文档)
# 插入单条文档
db.t2.insert({'name':'张三','age':18,'grade':89})
# 插入多条文档
db.t2.insert([{'name':'lisi','age':18},{'name':'王五','age':28},{'name':'赵六','age':35}])
更新文档
db.collection.update(
<query>,
<update>,
{
upsert: <boolean>,
multi: <boolean>,
}
)
#query : 查询条件,类似sql update查询内where后面的(必备)
#update : 修改操作 也可以理解为sql update查询内set后面的(必备)
#upsert :默认是false 即查询条件无记录 则不写入
#multi : 默认是false 即更新查询到的第一条记录
#实例
use T
db.createCollection('t2')
db.t2.insert({'name':'张三','age':18,'grade':89})
db.t2.insert({'name':'李四','age':38,'grade':69})
db.t2.insert({'name':'hh','age':34,'grade':45})
db.t2.insert({'name':'ww','age':25,'grade':100})
db.t2.insert({'name':'aa','age':28,'grade':79})
db.t2.insert({'name':'bb','age':42,'grade':83})
db.t2.insert({'name':'cc','age':16,'grade':77})
db.t2.insert({'name':'hh','age':36,'grade':75})
# 修改
# 将查询到的第一条文档,修改为{'name':'李四'}
db.t2.update({'name':'张三'},{'name':'李四'}) #{ "_id" : ObjectId("658d3b295112dfcf103b159d"), "name" : "李四" }-----就是把第一条【'name':'张三'】中的全部字段改成【'name':'李四'】
# 将查询到的第一条文档,name字段设置为lisi
db.t2.update({'name':'李四'},{$set:{'name':'lisi'}}) #db.t2.insert({'name':'李四','age':38,'grade':69})变成{ "_id" : ObjectId("658d3b295112dfcf103b159e"), "name" : "lisi", "age" : 38, "grade" : 69 }
# 将查询到的第一条文档,name字段修改为ww, 若没有查询到文档 则写入name字段
db.t2.update({'name':'yy'},{$set:{'name':'ww'}},true) #新增一条{ "_id" : ObjectId("658d40ba147b8ec5f6fb2631"), "name" : "ww" }
# 将查询到的所有文档,name字段修改为ww, 若没有查询到文档 则写入name字段
db.t2.update({'name':'ww'},{$set:{'name':'张三'}},true,true) #结果是【"name" : "ww"】全部变成了【"name" : "张三"】
删除文档
db.collection.remove(
<query>,
{
justOne: <boolean>,
writeConcern: <document>
}
)
query :(可选)删除的文档的条件。
justOne : (可选)默认为false 即删除所有符合条件的文档。如果设置为true或者1,表示删除一条文档
# 删除t2集合中 所有name字段为张三的文档
db.t2.remove({'name':'张三'}) #符合'name':'张三'数据全部删除
# 删除t1集合中 第一条name字段为hh的文档
db.t2.remove({'name':'hh'},1)
查询文档
# 查询t2集合中所有的文档
db.t2.find()
# 以更标准的格式查询t2集合中的所有文档
db.t2.find().pretty()
# 查询t2集合中 满足条件的文档
db.t2.find({'name':'aa'})
条件操作符号
比较运算
- (>) 大于 - $gt
- (<) 小于 - $lt
- (>=) 大于等于 - $gte
- (<= ) 小于等于 - $lte
- 默认是等于运算 没有操作符
- (!= ) 不等于 - $ne
db.t2.find({age:{$gt:18}})
db.t2.find({age:{$lt:40}})
db.t2.find({age:{$ne:40}})
逻辑运算
- 并且 多个条件逗号隔开 默认是$and运算
- 或者 $or
# 查询年龄大于18 并且成绩大于等于80分以上的文档,用【$and】
db.t2.find({$and:[{age:{$gt:18}},{grade:{$gte:80}}]})
# 查询 符号姓名为张三或者李四的所有文档,用【$or】
db.t1.find({$or:[{name:'张三'},{name:'李四'}]})
其他查询方法
count()
#查出数据求总和 也可以精确查找想要的总和
db.t2.find().count()
skip()
# 用于跳过指定数量的文档
db.t2.find().skip(2) #即跳过查询到的前面2条数据
limit()
# 用于读取指定数量的文档
db.t2.find().limit(3) #查询前面3条数据
limit()和skip()混用
db.t2.find().skip(1).limit(2) #先跳过第一条数据,在查询两条数据,db.t2.find().limit(2).skip(1)结果一样,所以limit()和skip()没有顺序之分
指定返回的字段
# 指定返回的字段,如果为1则返回该字段 如果为0则除了该字段外所有字段返回。id如果没写会默认返回
# 只查询所有文档的age字段
db.t2.find({},{age:1})
# 查询所有文档 除了age以外的字段
db.t2.find({},{age:0})
# 查询所有文档 除了age和id以外的字段
db.t2.find({},{age:0,_id:0})
排序
sort()
# 将查询结果根据 age字段升序进行排序
db.t2.find().sort({age:1})
# 将查询结果根据 age字段降序进行排序
db.t2.find().sort({age:-1})