MongoDB的基本操作

前言

mongodb是免费的跨平台NoSQL数据库,是非关系型数据库。MongoDB的数据以类似于JSON格式化的二进制文档存储:

{
  "name":"xxxx",
  "age":18,
  "hobbies":["play", "study"]
}

文档型数据库存储的几个重要的好处:文档的数据类型可以对应到语言的数据类型,如数组类型和对象类型;文档可以嵌套;

MongoDB基于分布式文件存储的数据库,数据由键值对组成支持丰富的查询表达,可以设置任何属性的索引;支持副本集、索引;

优点:

  1. 弱一致性,更能保证用户的访问速度
  2. 文档结构的存储方式,能够更便捷的获取数据,对于一个层级式的数据结构来说,如果将很多的数据使用扁平的表的数据存储起来,不管是在查询还是获取数据时都会很困难。
  3. 使用场合下,千万级别的文档对象,近10G的数据,对于有索引的id查询,不逊于Mysql数据库;对于没有索引的字段查询更是优于Mysql查询,同时写入性能也很厉害。

MongoDB的缺点:

  1. MongoDB不支持事务操作

    所以事务要求比较严格的系统,比如银行系统就不能用它。MongoDB4.0之后也逐渐支持事务了

  2. Mongodb占用空间过大

  3. 删除记录不释放空间:

    删除记录为了避免数据的移动,只标记”已删除“,方便以后还可以重复利用。

使用

  1. 使用数据库
use <数据库名>

如果数据库不存在,则创建数据库,否则切换到指定数据库

  1. 查看数据库

    show dbs
    

    会显示所有数据库的名字以及大小

  2. 创建集合

    db.createCollection("集合名",options)
    

    参数说明

    Options:可选参数(格式:{})

    options可以是如下参数(以下参数都是可选)

    字段 类型 描述
    capped 布尔 默认false,如果true,则创建固定集合。固定几个是创建固定大小的集合,达到做大值得时候,会自动覆盖最早的文档。true时,必须指定size参数
    autoIndexId 布尔 3.2之后不再支持该参数。如果true,自动在_id字段创建索引,默认为false
    size 数值 最大字节数,至少是256,当capped为true时才需要指定,一行文档的的大小不能超过最大字节数
    max 数值 最大文档数量,当capped为true时并且指定了size属性才能指定
  3. 删除集合

    1. Show collections 查看当前数据库所有集合
    2. db.集合名.drop()
  4. 插入文档数据

    # db.集合名.insert(文档内容)
    db.student.insert({
    	 "name":"xxx",
    	 "age":18,
    	 "sex":"man"
    })
    
  5. 更新文档

    #db.集合.update(
    #		<query>,
    #		<update>,
    #		{
    #			upsert: <boolean>,
    #			multi: <boolean>,
    #			writeConcern: <document>
    #		}
    #)
    db.student.update(
    	{"name":"aaa"},
    	{"$set":{"age": 11}}
    )
    

    参数说明

    • query: update的查询条件,类似sql update的where语句
    • update: update的对象和一系列更新的操作符($inc,$set等),也可以理解为sql update的set语句
    • Upsert: 可选,这个参数的意思是,如果不存在update的记录,是否插入记录,true为插入,默认是false,不插入。
    • Multi: 可选,mongodb默认是false,只更新找到的第一条记录,如果这个参数为true,则就按条件查出来多条记录全部更新。
    • writeConcern:可选,抛出异常的级别。
  6. 删除文档

    #db.collection.remove(
    #	<query>,
    #	{
    #		justOne:<boolean>,
    #		writeConcern:<document>
    #	}
    #)
    

    参数说明

    • Query: (可选)删除文档的条件
    • justOne:(可选)如果为true或1,则只删除一个文档
    • writeConcern:(可选)抛出异常的级别。
  7. 查询文档

    #db.collection.find(query, projection)
    db.student.find(
    {"name":"aaa"},
    {"name":1, "age": 1}
    )
    

    _id默认是显示出来的,如果想让他不显示,可以在大括号里写上_id:0

    参数说明

    • Query: 可选,使用查询操作符,查询条件
    • Projection:可选,查询的字段名,如果不写则表名查询所有。

    1). 等于

    #db.collectin.find({"键":"值"})
    db.student.find({"name":"aaa"})
    

    2). 不等于

    #db.collection.find({"键":{"$ne":"值"}})
    db.student.find({"name":{"$ne":"aaa"}}) 
    #类似于
    #select * from student where name != "aaa";
    

    3). and条件

    #db.collection.find("键1":"值1","键2":"值2")
    db.student.find("name":aaa, "age":18)
    

    4). or条件

    #db.collection.find({"$or":[{"键1":"值1"},{"键2":"值2"}...]})
    db.student.find({"$or":[{"name":"aaa"},{"name":"bbb"}]})
    

    5).比较条件

    #db.collection.find({"键1":{"$gt":值}})
    db.student.find({"age":{"$gt":18}})
    

    $gt表示>, $lt表示<,$gte表示>=, $lte表示:<=

    注意:值不要给双引号,否则将视为字符串,无法查出正确结果

    6). in

    #db.collection.find("键": {"$in":["值1","值2"]})
    db.student.find("name":{"$in":["aaa","bbb"})
    

    7). Not in

    #db.collection.find("键": {"$nin":["值1","值2"]})
    db.student.find("name":{"$nin":["aaa","bbb"})
    

    8).查询包含值数据

    #db.collection.find({"键": /值/})
    db.student.find({"name":/aaa/})
    

    9).查询以某个值开头和结尾的数据

    #db.collection.find({"键":/^值/}) 以某值开头的数据
    #db.collection.find({"键":/值$/}) 以某值结束的数据
    

    10).count

    #db.collection.count();
    

    11).升序

    #db.collection.find().sort({"read":1}) 升序
    #db.collection.find().sort({"read":-1}) 降序
    

    12). 匹配null

    #db.collection.find({'password':null});
    

    13). 去重

    #db.collection.distinct("键1")
    

    14). 查询N条数,跳过N条数

    #db.collection.find().limit(N) 查询N条
    #db.collection.find().skip(N) 跳过N条
    
  8. 聚合管道查询

    1). 关联查询

    db.collection.aggregate(
    	[
    		{
    			"$lookup":{
    				"from":"被关联的集合名",
    				"localField":"主集合的键名",
    				"foreignField":"被关联的集合的键名",
    				"as":"别名"
    			}
    		}
    	]
    )
    

    2).求和

    db.collection.aggregate({
    	$group: {
    		_id: "$键",
    		"别名": {
    			$sum: "$键名"
    		}
    	}
    })
    

    3). 最小值,最大值,平均值

    #最小值
    db.collection.aggregate({
    	$group:{
    		_id: "$键",
    		"别名": {
    			$min: "$键"
    		}
    	}
    })
    #最大值
    db.collection.aggregate({
    	$group:{
    		_id: "$键",
    		"别名": {
    			$max: "$键"
    		}
    	}
    })
    #平均值
    db.collection.aggregate({
    	$group:{
    		_id: "$键",
    		"别名": {
    			$avg: "$键"
    		}
    	}
    })
    

    4).获取排序后结果的第一条数据、最后一条数据

    #排序后第一条数据
    db.collection.aggregate([{
    	$group: {
            _id: 值,
            别名: {
                $first: "$键名"
            }
        }
    }])
    #排序后最后一条数据
    db.collection.aggregate([{
    	$group: {
            _id: 值,
            别名: {
                $last: "$键名"
            }
        }
    }])
    

    注:查询出来的结果一定是_id和别名,其他key不会显示出来。

posted @ 2022-04-18 16:04  天中之云  阅读(118)  评论(0编辑  收藏  举报