• MongoDB基础知识


    一、MongoDB介绍

    MongoDB是一个基于分布式文件存储 [1]  的数据库。由C++语言编写。旨在为WEB应用提供可扩展的高性能数据存储解决方案。
    MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。它支持的数据结构非常松散,是类似jsonbson格式,因此可以存储比较复杂的数据类型。Mongo最大的特点是它支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引
     

    二、MongoDB用法

    • 1、MongoDB的增删改查

    ###########查
    切换数据库:use test    注意:当该数据库不存在则会创建一个新的数据库
    查看当前数据库:db
    查看所有的数据库:show databases(简写dbs)
    查看该数据库下的所有集合:show collections(show tables)
    查看某个集合的内容:db.collection.find()
    
    ###########增
    `db.test1.insert({_id:'5f618bd390edf95aa3cc6f81',name:'alex'})`     #注意,当_id已存在时会报错
    `db.test1.save({_id:"5f618bd390edf95aa3cc6f81", name:"alex1",age:18})`    # 注意:当_id不存在时则新增,存在则更新
    
    ###########删
    `db.dropDatabase()`    # 删除当前数据库
    `db.test.remove({name:"xiaohong"},{justOne:1})`   #默认删除所有满足条件的数据,使用`{justOne:true}`能达到只删除一条的效果  
    
    ###########改
    `db.update({name:"xiaowang"},{name:"xiaogang"})`    #把名字为xiaowang的数据替换成{name:"xiaogang"}
    `db.test.update({name:"xiaowang"},{$set:{name:"xiaogang"}})`    #把{name:"xiaowang"}的name值更新为{name:"xiaogang"}
    `db.test.update({name:"xiaogang"},{$set:{name:"xiaohong"}},{multi:true})`    #`{multi:true}`更新全部
    •  2、MongoDB的高级查询

    1、查询符合条件:db.collection.find({条件})    `db.stu.find({city:"深圳"})`
    
    2、查询符合条件的一条数据:db.collection.findOne({条件})    `db.stu.findOne({city:"深圳"})`
    
    3、`pretty()`    结果格式化,使数据更直观    `db.stu.find({city:"深圳"}).pretty()`
    
    4、比较运算符
    大于:$gt
    小于:$lt
    大于等于:$gte
    小于等于:$lte
    不等于:$ne
    `db.stu.find({age:{$lt:20}})`
    
    4、范围运算符:$in
    `db.stu.find({age:{$in:[18,19,20]}})` 查询年龄在18-20范围内
    
    5、逻辑运算符
    (1)且(and),写多个条件即可
    eq:查询年龄为18,并且城市在深圳的学生
    `db.stu.find({age:18,city:"深圳"})`
    (2)或(or),$or
    eq:查询年龄为18或者城市在深圳的学生
    db.stu.find({$or:[{age:18},{city:"深圳"}]})
    
    6、正则匹配,$regex
    eq:匹配以“小”为开头的名字的学生
    `db.stu.find({name:{$regex:"^小"}})`
    
    7、分页查询:limit和skip
    eq:查询前两条数据
    `db.stu.find().limit(2)`
    eq:跳过前两条数据
    `db.stu.find().skip(2)`
    
    8、投影,选择返回的字段
    eq:只显示姓名
    `db.stu.find({age:{$lte:20}},{name:1})`
    注意:默认_id会显示出来,`{_id:0}`可以不显示
    
    9、排序:sort
    eq:降序
    `db.stu.find().sort({age:1})`
    eq:升序
    `db.stu.find().sort({age:-1})`
    
    10、统计数量:count
    eq:统计年龄小于等于20或者城市为深圳的学生格式
    方法一:`db.stu.find({$or:[{age:{$lte:20}},{city:"深圳"}]}).count()`
    方法二:`db.stu.count({$or:[{age:{$lte:20}},{city:"深圳"}]})`
    
    11、去重:distinct
    eq:查询年龄小于等于20的学生的城市
    `db.stu.distinct("city",{age:{$lte:20}})`
    • 3.MongoDB的备份和恢复

    1、备份mongodump
    参数:-h IP地址 
         --port=端口号
         -d 数据库
         -o 备份的目录
    eq:mongodump --port=38000 -d test -o ~/
    
    2、恢复mongorestore
    mongorestore -h hostip -d dbname --dir dirname
    eq:mongorestore -d test -dir ~/test
    • 4.聚合命令

    聚合和Linux中的管道一样,即是将上一次的结果传给下一次使用

    常用的管道:
    $group:分组,可用于统计结果
    $match:筛选,只分析符合条件的文档
    $project:修改输入的文档,如重命名、增加、删除字段,创建计算结果
    $sort
    $limit
    $skip
    • (1)$group,处理输入的文档并输出

    表达式:
    1、$sum:求和
    eq:统计每个地区的学生个数
    `db.stu.aggregate({$group:{_id:"$city",count:{$sum:1}}})`
    
    2、$avg:平均值
    eq:统计每个地区的学生的年龄平均值
    `db.stu.aggregate(
    {$
    group:{_id:"$city",avg_age:{$avg:"$age"}}}
    )`

    eq:统计所有学生的总人数和平均年龄
    `db.stu.aggregate(
    {$group:{_id:"null",sum:{$sum:1},avg_age:{$avg:"$age"}}}
    )`
    3、$min:取最小值
    4、$max:取最大值
    5、$push:在结果文档中插入值到数组中
    6、$first:取第一个文档
    7、$last:取最后一个文档
    •  (2)$project,修改格式

    eq:统计所有学生的总人数和平均年龄,并且将_id这个字段名改为`city`
    `db.stu.aggregate(
    {$group:{_id:"$city",sum:{$sum:1},avg_age:{$avg:"$age"}}},
    {$project:{city:"$_id",sum:1,avg_age:1,_id:0}} )`
    •  (3)$match,筛选条件

    eq:按不同的地区统计出年龄大于18岁的学生的人数,平均年龄
    `db.stu.aggregate(
    {$match:{age:{$gte:18}}},
    {$group:{_id:"$city",人数:{$sum:1},平均年龄:{$avg:"$age"}}},
    {$project:{_id:0,城市:"$_id",人数:1,平均年龄:1}}
    )`
    •  练习:

    原数据:

     eq:先去重,再统计每个国家的人数

    `db.country.aggregate(

    {$group:{_id:{country:"$country",pro:"$pro",name:"$name"}}},

    {$group:{_id:{country:"$_id.country"},sum:{$sum:1}}}

    )`

     (4)sort,limit,skip的使用

    1)sort:排序
    eq:按城市进行分组,统计每个城市的学生的平均年龄,并排序
    `db.stu.aggregate(
    {$group:{_id:"$city",平均年龄:{$avg:"$age"}}},
    {$project:{城市:"$_id",_id:0,平均年龄:1}},
    {$sort:{平均年龄:1}}
    )`


    (2)limit:限制
    eq:显示前两条数据
    `db.stu.aggregate({$limit:2})`

    (3)skip
    eq:跳过前两条数据
    `db.stu.aggregate({$skip:2})`

    5.索引操作

    建立索引:        
    (1)唯一索引:    `db.country.ensureIndex({name:1}{unique:true})`
    (2)组合索引:    `db.country.ensureIndex({name:1,country:1})`
    
    查看索引:
    `db.country.getIndexes()`
    
    删除索引:
    `db.country.ensureIndex({name:1,country:1})`
  • 相关阅读:
    六、HBase集成Phoenix安装
    新建虚拟机ping不通windows主机,windows主机ping不通虚拟机解决办法(图文)
    JSON数据转换之net.sf.json包的使用
    request.getParameter() 和request.getAttribute() 区别
    SQL Server中如何获取当前年,月,日,时,分,秒
    SQL强化:将相同的或连续的时间段合并
    ORA-20000:ORU-10027:buffer overflow,limit of 10000 bytes 解决方法
    Connect By
    深入理解connect by rownum
    Oracle获取两个日期之间的所有日期
  • 原文地址:https://www.cnblogs.com/maoxinjueluo/p/13834641.html
Copyright © 2020-2023  润新知