Mongodb 学习 安装 管理mongo 数据库连接 数据库切换 数据库创建 数据库删除 集合创建 查看当前数据库的集合 删除 数据类型 插入 简单查询 更新 保存 删除 关于size的示例 数据查询 Limit skip 一起使用 投影 排序 统计个数 消除重复(查询某字段有几种值) 总结

Mongodb 学习
安装
管理mongo
数据库连接
数据库切换
数据库创建
数据库删除
集合创建
查看当前数据库的集合
删除
数据类型
插入
简单查询
更新
保存
删除
关于size的示例
数据查询
Limit
skip
一起使用
投影
排序
统计个数
消除重复(查询某字段有几种值)
总结

  • 下载mongodb的版本,两点注意
    • 根据业界规则,偶数为稳定版,如1.6.X,奇数为开发版,如1.7.X
    • 32bit的mongodb最大只能存放2G的数据,64bit就没有限制
  • 到官网,选择合适的版本下载
  • 解压
tar -zxvf mongodb-linux-x86_64-ubuntu1604-3.4.0.tgz
  • 移动到/usr/local/目录下
sudo mv -r mongodb-linux-x86_64-ubuntu1604-3.4.0/ /usr/local/mongodb
  • 将可执行文件添加到PATH路径中
export PATH=/usr/local/mongodb/bin:$PATH

管理mongo

  • 配置文件在/etc/mongod.conf
  • 默认端口27017

  • 启动

sudo service mongod start
  • 停止
sudo service mongod stop

数据库连接

在 云主机 上使用 mongo 命令进行连接,命令样例如下:

mongo 10.0.1.132:27017 -u root -p 123456789 --authenticationDatabase admin
 

数据库切换

  • 查看当前数据库名称
db
  • 查看所有数据库名称
  • 列出所有在物理上存在的数据库
show dbs
  • 切换数据库
  • 如果数据库不存在,则指向数据库,但不创建,直到插入数据或创建集合时数据库才被创建
use 数据库名称
  • 默认的数据库为test,如果你没有创建新的数据库,集合将存放在test数据库中

数据库创建

mongodb的数据库不用创建,直接use切换即可。

数据库删除

  • 删除当前指向的数据库
  • 如果数据库不存在,则什么也不做
db.dropDatabase()

集合创建

  • 语法
db.createCollection(name, options)
  • name是要创建的集合的名称
  • options是一个文档,用于指定集合的配置
  • 选项​​参数是可选的,所以只需要到指定的集合名称。以下是可以使用的选项列表:
  • 例1:不限制集合大小
db.createCollection("stu")
  • 例2:限制集合大小,后面学会插入语句后可以查看效果
  • 参数capped:默认值为false表示不设置上限,值为true表示设置上限
  • 参数size:当capped值为true时,需要指定此参数,表示上限大小,当文档达到上限时,会将之前的数据覆盖,单位为字节
db.createCollection("sub", { capped : true, size : 10 } )

查看当前数据库的集合

  • 语法
show collections

删除

  • 语法
db.集合名称.drop()


数据类型

  • 下表为MongoDB中常用的几种数据类型:
  • Object ID:文档ID
  • String:字符串,最常用,必须是有效的UTF-8
  • Boolean:存储一个布尔值,true或false
  • Integer:整数可以是32位或64位,这取决于服务器
  • Double:存储浮点值
  • Arrays:数组或列表,多个值存储到一个键
  • Object:用于嵌入式的文档,即一个值为一个文档
  • Null:存储Null值
  • Timestamp:时间戳
  • Date:存储当前日期或时间的UNIX时间格式

object id

  • 每个文档都有一个属性,为_id,保证每个文档的唯一性
  • 可以自己去设置_id插入文档
  • 如果没有提供,那么MongoDB为每个文档提供了一个独特的_id,类型为objectID
  • objectID是一个12字节的十六进制数
    • 前4个字节为当前时间戳
    • 接下来3个字节的机器ID
    • 接下来的2个字节中MongoDB的服务进程id
    • 最后3个字节是简单的增量值


    • 插入

      • 语法
      db.集合名称.insert(document)
      
      • 插入文档时,如果不指定_id参数,MongoDB会为文档分配一个唯一的ObjectId
      • 例1
      db.stu.insert({name:'gj',gender:1})
      
      • 例2
      s1={_id:'20160101',name:'hr'}
      s1.gender=0
      db.stu.insert(s1)
    • mongo 192.168.1.21:27017 -u root -p Wyf@1314 --authenticationDatabase admin
      MongoDB shell version v3.6.14
      connecting to: mongodb://192.168.1.21:27017/test?authSource=admin&gssapiServiceName=mongodb
      Implicit session: session { "id" : UUID("77e6eef1-4e56-413a-b567-7cd5386838d8") }
      MongoDB server version: 3.6.8
      8e08b0f0-7db1-49aa-8274-05c3bca10e67:PRIMARY> 
      8e08b0f0-7db1-49aa-8274-05c3bca10e67:PRIMARY> 
      8e08b0f0-7db1-49aa-8274-05c3bca10e67:PRIMARY> show dbs
      admin   0.000GB
      config  0.000GB
      local   0.000GB
      8e08b0f0-7db1-49aa-8274-05c3bca10e67:PRIMARY> use py3
      switched to db py3
      8e08b0f0-7db1-49aa-8274-05c3bca10e67:PRIMARY> show collections
      8e08b0f0-7db1-49aa-8274-05c3bca10e67:PRIMARY> db.stu.insert({name:'qj',gender:true})
      WriteResult({ "nInserted" : 1 })
      8e08b0f0-7db1-49aa-8274-05c3bca10e67:PRIMARY> show collections
      stu

      简单查询

      • 语法
      db.集合名称.find()
    • 8e08b0f0-7db1-49aa-8274-05c3bca10e67:PRIMARY> db.stu.find()
      { "_id" : ObjectId("5ef1bc9a5192e418c6c6e193"), "name" : "qj", "gender" : true }

      更新

      • 语法
      db.集合名称.update(
         <query>,
         <update>,
         {multi: <boolean>}
      )
      
      • 参数query:查询条件,类似sql语句update中where部分
      • 参数update:更新操作符,类似sql语句update中set部分
      • 参数multi:可选,默认是false,表示只更新找到的第一条记录,值为true表示把满足条件的文档全部更新
      • 例3:全文档更新,更新后原来有的字段没写,就被删除了·
      8e08b0f0-7db1-49aa-8274-05c3bca10e67:PRIMARY> db.stu.find()
      { "_id" : ObjectId("5ef1bc9a5192e418c6c6e193"), "name" : "qj", "gender" : true }
      8e08b0f0-7db1-49aa-8274-05c3bca10e67:PRIMARY> db.stu.update({name:"qj"},{name:'QJJ'})
      WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
      8e08b0f0-7db1-49aa-8274-05c3bca10e67:PRIMARY> db.stu.find()
      { "_id" : ObjectId("5ef1bc9a5192e418c6c6e193"), "name" : "QJJ" }
      • 例4:指定属性更新(只改部分数据),通过操作符$set
      8e08b0f0-7db1-49aa-8274-05c3bca10e67:PRIMARY> db.stu.find()
      { "_id" : ObjectId("5ef1bc9a5192e418c6c6e193"), "name" : "zhangmingda" }
      { "_id" : ObjectId("5ef1be565192e418c6c6e194"), "name" : "zmd", "gender" : "false" }
      8e08b0f0-7db1-49aa-8274-05c3bca10e67:PRIMARY> db.stu.update({name:'zmd'},{$set:{name:"dashen"}})
      WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
      8e08b0f0-7db1-49aa-8274-05c3bca10e67:PRIMARY> db.stu.find()
      { "_id" : ObjectId("5ef1bc9a5192e418c6c6e193"), "name" : "zhangmingda" }
      { "_id" : ObjectId("5ef1be565192e418c6c6e194"), "name" : "dashen", "gender" : "false" }
      • 例5:修改多条匹配到的数据
      db.stu.update({},{$set:{gender:0}},{multi:true})
      8e08b0f0-7db1-49aa-8274-05c3bca10e67:PRIMARY> db.stu.update({},{$set:{name:"zmd"}},{multi:true})
      WriteResult({ "nMatched" : 2, "nUpserted" : 0, "nModified" : 1 })
      8e08b0f0-7db1-49aa-8274-05c3bca10e67:PRIMARY> db.stu.find()
      { "_id" : ObjectId("5ef1bc9a5192e418c6c6e193"), "name" : "zmd" }
      { "_id" : ObjectId("5ef1be565192e418c6c6e194"), "name" : "zmd", "gender" : "false" }
    • 保存

      • 语法
      db.集合名称.save(document)
      
      • 如果文档的_id已经存在则修改,如果文档的_id不存在则添加

        8e08b0f0-7db1-49aa-8274-05c3bca10e67:PRIMARY> db.stu.find()
        
        { "_id" : ObjectId("5ef1c2b65192e418c6c6e196"), "name" : "qjj", "gender" : true }
        8e08b0f0-7db1-49aa-8274-05c3bca10e67:PRIMARY> db.stu.save({_id:ObjectId("5ef1c2b65192e418c6c6e196"),gender:false})
        WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
        8e08b0f0-7db1-49aa-8274-05c3bca10e67:PRIMARY> db.stu.find()
        
        { "_id" : ObjectId("5ef1c2b65192e418c6c6e196"), "gender" : false }

      删除

      • 语法
      db.集合名称.remove(
         <query>,
         {
           justOne: <boolean>
         }
      )
      
      • 参数query:可选,删除的文档的条件
      • 参数justOne:可选,如果设为true或1,则只删除一条,默认false,表示删除多条
      • 例8:只删除匹配到的第一条
      db.stu.remove({gender:0},{justOne:true})
      
      • 例9:全部删除
      db.stu.remove({})
      

      关于size的示例

      • 例10
      • 创建集合
      db.createCollection('sub',{capped:true,size:10})
      
      • 插入第一条数据库查询
      db.sub.insert({title:'linux',count:10})
      db.sub.find()
      
      • 插入第二条数据库查询
      db.sub.insert({title:'web',count:15})
      db.sub.find()
      
      • 插入第三条数据库查询
      db.sub.insert({title:'sql',count:8})
      db.sub.find()
      
      • 插入第四条数据库查询
      db.sub.insert({title:'django',count:12})
      db.sub.find()
      
      • 插入第五条数据库查询
      db.sub.insert({title:'python',count:14})
      db.sub.find()

数据查询

基本查询

  • 方法find():查询
db.集合名称.find({条件文档})
  • 方法findOne():查询,只返回第一个
    8e08b0f0-7db1-49aa-8274-05c3bca10e67:PRIMARY> db.stu.find()
    { "_id" : ObjectId("5ef1bc9a5192e418c6c6e193"), "name" : "zhangmingda" }
    { "_id" : ObjectId("5ef1c2985192e418c6c6e195"), "name" : "qjj" }
    8e08b0f0-7db1-49aa-8274-05c3bca10e67:PRIMARY> db.stu.findOne({name:"zhangmingda"})
    { "_id" : ObjectId("5ef1bc9a5192e418c6c6e193"), "name" : "zhangmingda" }
db.集合名称.findOne({条件文档})
  • 方法pretty():将结果格式化
db.集合名称.find({条件文档}).pretty()

比较运算符

  • 等于,默认是等于判断,没有运算符
  • 小于$lt
  • 小于或等于$lte
  • 大于$gt
  • 大于或等于$gte
  • 不等于$ne
  • 例1:查询名称等于'gj'的学生
db.stu.find({name:'gj'})
  • 例2:查询年龄大于或等于18的学生
db.stu.find({age:{$gte:18}})

逻辑运算符

  • 查询时可以有多个条件,多个条件之间需要通过逻辑运算符连接
  • 逻辑与:默认是逻辑与的关系
  • 例3:查询年龄大于或等于18,并且性别为1的学生
db.stu.find({age:{$gte:18},gender:1})
  • 逻辑或:使用$or
  • 例4:查询年龄大于18,或性别为0的学生
db.stu.find({$or:[{age:{$gt:18}},{gender:1}]})
  • and和or一起使用
  • 例5:查询年龄大于18或性别为0的学生,并且学生的姓名为gj
db.stu.find({$or:[{age:{$gte:18}},{gender:1}],name:'gj'})

范围运算符

  • 使用"$in","$nin" 判断是否在某个范围内
  • 例6:查询年龄为18、28的学生
db.stu.find({age:{$in:[18,28]}})

支持正则表达式

  • 使用//或$regex编写正则表达式
  • 例7:查询姓黄的学生
db.stu.find({name:/^黄/})
db.stu.find({name:{$regex:'^黄'}}})

自定义查询

  • 使用$where后面写一个函数,返回满足条件的数据
  • 例7:查询年龄大于30的学生
db.stu.find({$where:function(){return this.age>20}})

Limit

  • 方法limit():用于读取指定数量的文档
  • 语法:
db.集合名称.find().limit(NUMBER)
  • 参数NUMBER表示要获取文档的条数
  • 如果没有指定参数则显示集合中的所有文档
  • 例1:查询2条学生信息
db.stu.find().limit(2)

skip

  • 方法skip():用于跳过指定数量的文档
  • 语法:
db.集合名称.find().skip(NUMBER)
  • 参数NUMBER表示跳过的记录条数,默认值为0
  • 例2:查询从第3条开始的学生信息
db.stu.find().skip(2)

一起使用

  • 方法limit()和skip()可以一起使用,不分先后顺序

  • 创建数据集

for(i=0;i<15;i++){db.t1.insert({_id:i})}
  • 查询第5至8条数据
db.stu.find().limit(4).skip(5)
或
db.stu.find().skip(5).limit(4)

投影

  • 在查询到的返回结果中,只选择必要的字段,而不是选择一个文档的整个字段
  • 如:一个文档有5个字段,需要显示只有3个,投影其中3个字段即可
  • 语法:
  • 参数为字段与值,值为1表示显示,值为0不显示
db.集合名称.find({},{字段名称:1,...})
  • 对于需要显示的字段,设置为1即可,不设置即为不显示
  • 特殊:对于_id列默认是显示的,如果不显示需要明确设置为0
  • 例1
db.stu.find({},{name:1,gender:1})
  • 例2
db.stu.find({},{_id:0,name:1,gender:1})

排序

  • 方法sort(),用于对结果集进行排序
  • 语法
db.集合名称.find().sort({字段:1,...})
  • 参数1为升序排列
  • 参数-1为降序排列
  • 例1:根据性别降序,再根据年龄升序
db.stu.find().sort({gender:-1,age:1})

统计个数

  • 方法count()用于统计结果集中文档条数
  • 语法
db.集合名称.find({条件}).count()
  • 也可以与为
db.集合名称.count({条件})
  • 例1:统计男生人数
db.stu.find({gender:1}).count()
  • 例2:统计年龄大于20的男生人数
db.stu.count({age:{$gt:20},gender:1})

消除重复(查询某字段有几种值)

  • 方法distinct()对数据进行去重
  • 语法
db.集合名称.distinct('去重字段',{条件})
  • 例1:查找年龄大于18的性别的值有几种(去重)
db.stu.distinct('gender',{age:{$gt:18}})

总结

  • 安装
  • 数据库创建、删除
  • 集合创建、删除
  • 文档增加、修改、删除
  • 文档查询:find(),limit(),skip(),投影,sort(),count(),distinct()