mongoDB数据库

MongoDB 数据库

基本操作

启动
  • mongod
  • mongo
基本操作
  • 查看数据库

    • show databases
  • 选择数据库

    • use 数据库名称
    • 隐式创建;当选择不存在的数据库时不会报错,后期当该数据库有数据时,系统会自动创建
  • 查看集合

    • show collections (集合名称为复数(末尾加s))
  • 创建集合

    • db.create集合名称('集合名')
    • (集合名称与 create 相连且为驼峰式书写)
  • 删除集合

    • db.集合名.drop()
<-- 查看集合  -->
> show collections
users
<--  创建集合  -->
> db.createCollection('test1')
{ "ok" : 1 }
> db.createCollection('test2')
{ "ok" : 1 }
> show collections
test1
test2
users
<-- 删除集合 -->
> db.test1.drop()
true
> show collections
test2
users
  • 删除数据库
    1. 通过 use 语法选中数据库
    2. 通过 db.dropDatabase() 删除数据库
      在这里插入图片描述
MongoDB 文档增删改查(CURD)
新增( insert )
  • 语法:db.集合名.insert(JSON数据)

    • 集合存在->则直接插入数据,集合不存在->隐式创建

    • 练习:在 test2 数据库的c1 集合中插入数据(姓名:webopenfather,年龄:18)

    • ·数据库和集合如果不存在,都会隐式自动创建

    • ·当插入数据时,给对象中的变量名可以不加引号,但是查看集合数据时系统会自动加

    • 当成功插入一条数据后,mongodb 会给每条数据增加一个唯一的—id 键
      在这里插入图片描述

    • 一次性插入多条数据(数组中写一个JSON数据即可)

      db.c1.insert([
      	{name:"Zip",age:12},
      	{name:"Jarry",age:18},
      	{name:"Zoom",age:15},
      ])
      
    • 插入很多条数据时

      • mongodb 底层使用 JS 引擎实现的,所以支持部分 js 语法

      • 因此可以写 for 循环

        for(var i = 1;i <= 10;i ++){
        	db.c1.insert({ uname:"a"+i,age:i })
        }
        

    在这里插入图片描述

查询 ( find() )
  • 语法:db.集合名.find({条件},{查询的列})

  • 传入参数的使用方法:

    条件
    查询所有数据{},或不写
    查询 age = 6 的数据{age:6}
    查询 age = 6 且 sex = 男 数据{age:6,sex:‘男’}
    查询的列 (可选参数)
    查询全部数据不写
    只显示 age 列(字段){ age:1 }
    除了 age 字段不显示{ age:0 }
    // 练习
    > db.test3.find({uname:"a3"})
    { "_id" : ObjectId("605a88ea18656b38335fbe5f"), "uname" : "a3", "age" : 3 }
    > db.test3.find({uname:"a3"},{age:1})
    { "_id" : ObjectId("605a88ea18656b38335fbe5f"), "age" : 3 }
    > db.test3.find({uname:"a3"},{age:0})
    { "_id" : ObjectId("605a88ea18656b38335fbe5f"), "uname" : "a3" }
    > db.test3.find({uname:"a3"},{})
    { "_id" : ObjectId("605a88ea18656b38335fbe5f"), "uname" : "a3", "age" : 3 }
    
    • 按条件查询语法:db.集合名.find({字段名:{运算符:值}})

      运算符作用
      $gt大于
      $gte大于等于
      $lt小于
      $lte小于等于
      $ne不等于
      $inin
      $ninnot in
    • 练习

      // 查询年龄大于 5 的数据
      >  db.test3.find({age:{$gt:5}})
      { "_id" : ObjectId("605a88ea18656b38335fbe62"), "uname" : "a6", "age" : 6 }
      { "_id" : ObjectId("605a88ea18656b38335fbe63"), "uname" : "a7", "age" : 7 }
      { "_id" : ObjectId("605a88ea18656b38335fbe64"), "uname" : "a8", "age" : 8 }
      { "_id" : ObjectId("605a88ea18656b38335fbe65"), "uname" : "a9", "age" : 9 }
      { "_id" : ObjectId("605a88ea18656b38335fbe66"), "uname" : "a10", "age" : 10 }
      
      // 查询年龄小于 5,并且只显示 uname 字段
      > db.test3.find({age:{$lte:6}},{uname:1})
      { "_id" : ObjectId("605a88ea18656b38335fbe5d"), "uname" : "a1" }
      { "_id" : ObjectId("605a88ea18656b38335fbe5e"), "uname" : "a2" }
      { "_id" : ObjectId("605a88ea18656b38335fbe5f"), "uname" : "a3" }
      { "_id" : ObjectId("605a88ea18656b38335fbe60"), "uname" : "a4" }
      { "_id" : ObjectId("605a88ea18656b38335fbe61"), "uname" : "a5" }
      { "_id" : ObjectId("605a88ea18656b38335fbe62"), "uname" : "a6" }
      
修改(update)
  • 修改器

    修改器作用
    $inc递增
    $rename重命名,修改字段
    $set修改列(字段)的值
    $unset删除列(字段)
  • 语法

    • db.集合名.update(条件,{修改器:{新数据}})
  • 练习
    在这里插入图片描述

// 将年龄为3数据的年龄 +3   (也可为负数,意为减)
> db.test3.update({age:3},{$inc:{age:3}})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.test3.find()
{ "_id" : ObjectId("605a88ea18656b38335fbe5d"), "uname" : "a1", "age" : 1 }
{ "_id" : ObjectId("605a88ea18656b38335fbe5e"), "uname" : "a2", "age" : 2 }
{ "_id" : ObjectId("605a88ea18656b38335fbe5f"), "uname" : "a13", "age" : 6 }
{ "_id" : ObjectId("605a88ea18656b38335fbe60"), "uname" : "a4", "age" : 4 }

// 将名称为 a3 数据的名称改为 a13
> db.test3.update({uname:"a3"},{$set:{uname:"a13"}})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.test3.find()
{ "_id" : ObjectId("605a88ea18656b38335fbe5d"), "uname" : "a1", "age" : 1 }
{ "_id" : ObjectId("605a88ea18656b38335fbe5e"), "uname" : "a2", "age" : 2 }
{ "_id" : ObjectId("605a88ea18656b38335fbe5f"), "uname" : "a13", "age" : 3 }
{ "_id" : ObjectId("605a88ea18656b38335fbe60"), "uname" : "a4", "age" : 4 }

// 综合写法
> db.test3.find({name:"Jarry"})
{ "_id" : ObjectId("605b059f5ebecf5896dfdd9b"), "name" : "Jarry", "age" : 19, "hobbies" : "play games", "who" : "sex" }
// 当连起来写时注意:(删除时写入字段名,值为true)
> db.test3.update({name:"Jarry"},{
...                 $set:{name:"John"},
...                 $rename:{who:"sexName"},
...                 $inc:{age:4},
...                 $unset:{hobbies:true}
... })
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.test3.find({name:"John"})
{ "_id" : ObjectId("605b059f5ebecf5896dfdd9b"), "name" : "John", "age" : 23, "sexName" : "sex" }

  • 语法:db.集合名.update(条件,新数据[是否新增,是否修改多条])

    • 是否新增:指条件匹配不到数据则插入(true 是插入,false 不插入默认)
      - 是否修改多条:指将匹配成功的数据都修改( true 是,false 否默认)
    db.test2.find()
    { "_id" : ObjectId("605a836418656b38335fbe5c"), "name" : "Zip", "age" : 34 }
    db.test2.update({name:"John"},{$set:{name:"Jarry"}},true)
    WriteResult({
       "nMatched" : 0,
       "nUpserted" : 1,
       "nModified" : 0,
       "_id" : ObjectId("605b0ed01a182990c745cf7a")
    })
    db.test2.find()
    { "_id" : ObjectId("605a836418656b38335fbe5c"), "name" : "Zip", "age" : 34 }
    { "_id" : ObjectId("605b0ed01a182990c745cf7a"), "name" : "Jarry" }
    
删除
  • 语法:db.集合名.remove(条件,[是否删除一条])

    • [是否删除一条]:true 或 false
    > db.test3.remove({},true)
      WriteResult({ "nRemoved" : 1 })
      > db.test3.remove({})
      WriteResult({ "nRemoved" : 10 })
      > db.test3.find()
      >
    
总结(增、删、改、查)
  1. 增 Create

    db.集合名.insert(JSON数据)
    
    
  2. 删 Delete

    db.集合名.remove(条件,[是否删除一条])
    
    
  3. 改 update

    db.集合名.update(条件,{修改器:{字段名:值}})
    
    
  4. 查 Read

    db.集合名.find(条件,[查询的字段])
    
    
排序
  • 语法:`db.集合名.find().sort({字段名:1 或 -1})
  • 【1】 升序;【-1】降序
> db.test3.find().sort({age:-1})
    { "_id" : ObjectId("605bdca20991976d007ead74"), "name" : "Jarry", "age" : 9 }
    { "_id" : ObjectId("605bdca20991976d007ead73"), "name" : "Jarry", "age" : 8 }
    { "_id" : ObjectId("605bdca20991976d007ead72"), "name" : "Jarry", "age" : 7 }
    { "_id" : ObjectId("605bdca20991976d007ead71"), "name" : "Jarry", "age" : 6 }
> db.test3.find().sort({age:1}))
    { "_id" : ObjectId("605bdca20991976d007ead71"), "name" : "Jarry", "age" : 6 }
    { "_id" : ObjectId("605bdca20991976d007ead72"), "name" : "Jarry", "age" : 7 }
    { "_id" : ObjectId("605bdca20991976d007ead73"), "name" : "Jarry", "age" : 8 }
    { "_id" : ObjectId("605bdca20991976d007ead74"), "name" : "Jarry", "age" : 9 }

Limit 与 Skip方法
  • 语法:db.集合名.find().sort().skip(数字).limit(数字)
  • skip 跳过指定数量(可选),limit限制查询的数量
  • 练习:1.降序查询两条数据;2.降序跳过2跳并查询2条
> db.test3.find().sort({age:-1})
{ "_id" : ObjectId("605bdca20991976d007ead74"), "name" : "Jarry", "age" : 9 }
{ "_id" : ObjectId("605bdca20991976d007ead73"), "name" : "Jarry", "age" : 8 }
{ "_id" : ObjectId("605bdf360991976d007ead77"), "name" : "Jarry", "age" : 5 }
{ "_id" : ObjectId("605bdf1b0991976d007ead76"), "name" : "Jarry", "age" : 4 }
{ "_id" : ObjectId("605bdf1b0991976d007ead75"), "name" : "Jarry", "age" : 3 }
> db.test3.find().sort({age:-1}).limit(2)
{ "_id" : ObjectId("605bdca20991976d007ead74"), "name" : "Jarry", "age" : 9 }
{ "_id" : ObjectId("605bdca20991976d007ead73"), "name" : "Jarry", "age" : 8 }
> db.test3.find().sort({age:-1}).skip(2).limit(2)
{ "_id" : ObjectId("605bdf360991976d007ead77"), "name" : "Jarry", "age" : 5 }
{ "_id" : ObjectId("605bdf1b0991976d007ead76"), "name" : "Jarry", "age" : 4 }

分页(基础案例)
  • 需求:数据库 1-10 条数据,每页显示两条(5页)
  • 语法: `db.集合名.find().skip().limit(2)
skip计算公式:(当前页 - 1* 每页显示条数

聚合查询
  • 语法:db.集合名.aggregate([{管道:{表达式}])

  • 常用管道

    $group将集合中的文档分组,用于统计结果
    $match过滤数据,只要输出符合条件的文档
    $sort聚合数据进一步排序
    $skip跳过指定文档数
    $limit限制集合数据返回文档数
  • 常用表达式

    $sum总和
    $avg平均
    $min最小值
    $max最大值
    $sum:1统计其个数
  • 案例练习

  • 准备数据

    > db.cl.insert({_id:1,name:"a",sex:1,age:1})
      > db.cl.insert({_id:2,name:"a",sex:1,age:2})
      > db.cl.insert({_id:3,name:"b",sex:2,age:3})
      > db.cl.insert({_id:4,name:"c",sex:2,age:4})
      > db.cl.insert({_id:5,name:"d",sex:2,age:5})
      > db.cl.find()
      { "_id" : 1, "name" : "a", "sex" : 1, "age" : 1 }
      { "_id" : 2, "name" : "a", "sex" : 1, "age" : 2 }
      { "_id" : 3, "name" : "b", "sex" : 2, "age" : 3 }
      { "_id" : 4, "name" : "c", "sex" : 2, "age" : 4 }
      { "_id" : 5, "name" : "d", "sex" : 2, "age" : 5 }
    
  1. 统计男生、女生的总年龄
> > db.cl.aggregate([
	{
		$group:{
			_id:"$sex",
			result:{$sum:"$age"}
		}
	}
])

{ "_id" : 2, "result" : 12 }
{ "_id" : 1, "result" : 3 }

  1. 统计男生、女生的总人数(个数)(count)
> > db.cl.aggregate([
	{
		$group:{_id:"$sex",result:{$sum:1}}
	}
])

{ "_id" : 2, "result" : 3 }
{ "_id" : 1, "result" : 2 }

  1. 求学生总数和平均年龄
> > db.cl.aggregate([
	{
		$group:{_id:null,total_num:{$sum:1},total_avg:{$avg:"$age"}}
	}
])

{ "_id" : null, "total_num" : 5, "total_avg" : 3 }

  1. 查询男生、女生人数,按人数升序
> > db.cl.aggregate([
	{$group:{_id:"$sex",total_num:{$sum:1}}},
	{$sort:{total_num:1}}
])

{ "_id" : 1, "total_num" : 2 }
{ "_id" : 2, "total_num" : 3 }

索引
创建索引
  • 创建索引语法:db.集合名.createIndex(待创建索引的列[额外选项])
  • 参数:
    • 待创建索引的列:{键:1,…键…,键:-1}
    • 1 为升序;-1 为降序,例如{age:1}表示age 索引并按照升序的方式存储
    • 额外选项 :设置索引的名称或者唯一索引等
删除索引
  1. 全部删除:db.集合名.dropIndexes()
  2. 删除指定:db.集合名.dropIndex(索引名)
查看索引
  • 语法:`db.集合名.getIndexes()
练习

准备

for(var i=0;i<100000;i++){db.test3.insert({"name":"aaa"+i,"age":i})}
WriteResult({ "nInserted" : 1 })

  1. 给 name 添加普通索引,
  • db.test3.createIndex({name:1})

在这里插入图片描述

  1. 删除 name 索引,
  • 命令:db.集合名.dropIndex()
> db.test3.getIndexes()
[
        {
                "v" : 2,
                "key" : {
                        "_id" : 1
                },
                "name" : "_id_"
        },
        {
                "v" : 2,
                "key" : {
                        "name" : 1
                },
                "name" : "name_1"
        }
]
> db.test3.dropIndex("name_1"})
SyntaxError: missing ) after argument list :
@(shell):1:27
> db.test3.dropIndexes("name_1")
{ "nIndexesWas" : 2, "ok" : 1 }
> db.test3.getIndexes()
[ { "v" : 2, "key" : { "_id" : 1 }, "name" : "_id_" } ]

3.给 name 创建索引并起名 webopenfather

  • 命令:db.test3.createIndex({name:1},{name:"webopenfather"})
> db.test3.createIndex({name:1},{name:"webopenfather"})
{
        "createdCollectionAutomatically" : false,
        "numIndexesBefore" : 1,
        "numIndexesAfter" : 2,
        "ok" : 1
}
> db.test3.getIndexes()
[
        {
                "v" : 2,
                "key" : {
                        "_id" : 1
                },
                "name" : "_id_"
        },
        {
                "v" : 2,
                "key" : {
                        "name" : 1
                },
                "name" : "webopenfather"
        }
]

  1. 创建复合/组合索引
  • 需求:给name和age 添加组合索引
  • 说明:一次性给两个字段建立索引
  • 语法:db.集合名createIndex({键1:方式,键1:方式})
> db.test3.createIndex({name:1,age:1})
{
        "createdCollectionAutomatically" : false,
        "numIndexesBefore" : 2,
        "numIndexesAfter" : 3,
        "ok" : 1
}
> db.test3.getIndexes()
[
        {
                "v" : 2,
                "key" : {
                        "_id" : 1
                },
                "name" : "_id_"
        },
        {
                "v" : 2,
                "key" : {
                        "name" : 1
                },
                "name" : "webopenfather"
        },
        {
                "v" : 2,
                "key" : {
                        "name" : 1,
                        "age" : 1
                },
                "name" : "name_1_age_1"
        }
]

  1. 设置唯一索引
  • 命令:db.test3.createIndex({name:1},{unique:"name"})
  1. 测试唯一索引特性
  • 命令:db.test3.insert({name:"a"})

  • 命令:db.test3.insert({name:"a"})

在这里插入图片描述

分析索引(explain)
  • 语法:db.集合名.find().explain('executionStats')

  • 说明

  • 索引扫描方式:COLLSCAN: 全盘扫描;IXSCAN :索引扫描; FETCH : 根据索引取检索指定 document

  • 练习

    1. 测试 age 未添加索引情况
    • 语法:db.test3.find({age:18}).explain('executionStats')

权限机制

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值