MongoDB基础

53 阅读5分钟

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中基本的概念是文档、集合和数据库

image.png

MongoDB三要素

  • 数据库:一个集合的物理容器,一个数据库可以包含多个文档(一个服务器通常有多个数据库)。
  • 集合:类似于关系型数据库中的表,集合存在于数据库中,集合没有固定的结构,这意味着你在对集合可以插入不同格式和类型的数据,但通常情况下我们插入集合的数据都会有一定的关联性。
  • 文档:就是关系型数据库中的一行。文档是一个对象,由键值对构成,是json的扩展形式

MongoDB数据类型

  • String:字符串,必须是有效的UTF-8
  • Boolean:存储一个布尔值,true或者false
  • Integer:整数可以是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参数如下:

image.png

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'})

条件操作符号

比较运算

  1. (>) 大于 - $gt
  2. (<) 小于 - $lt
  3. (>=) 大于等于 - $gte
  4. (<= ) 小于等于 - $lte
  5. 默认是等于运算 没有操作符
  6. (!= ) 不等于 - $ne
db.t2.find({age:{$gt:18}})

db.t2.find({age:{$lt:40}})

db.t2.find({age:{$ne:40}})

逻辑运算

  1. 并且 多个条件逗号隔开 默认是$and运算
  2. 或者 $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})