MongoDB的基本操作
前言
mongodb是免费的跨平台NoSQL数据库,是非关系型数据库。MongoDB的数据以类似于JSON格式化的二进制文档存储:
{
"name":"xxxx",
"age":18,
"hobbies":["play", "study"]
}
文档型数据库存储的几个重要的好处:文档的数据类型可以对应到语言的数据类型,如数组类型和对象类型;文档可以嵌套;
MongoDB基于分布式文件存储的数据库,数据由键值对组成支持丰富的查询表达,可以设置任何属性的索引;支持副本集、索引;
优点:
- 弱一致性,更能保证用户的访问速度
- 文档结构的存储方式,能够更便捷的获取数据,对于一个层级式的数据结构来说,如果将很多的数据使用扁平的表的数据存储起来,不管是在查询还是获取数据时都会很困难。
- 使用场合下,千万级别的文档对象,近10G的数据,对于有索引的id查询,不逊于Mysql数据库;对于没有索引的字段查询更是优于Mysql查询,同时写入性能也很厉害。
MongoDB的缺点:
-
MongoDB不支持事务操作
所以事务要求比较严格的系统,比如银行系统就不能用它。MongoDB4.0之后也逐渐支持事务了
-
Mongodb占用空间过大
-
删除记录不释放空间:
删除记录为了避免数据的移动,只标记”已删除“,方便以后还可以重复利用。
使用
- 使用数据库
use <数据库名>
如果数据库不存在,则创建数据库,否则切换到指定数据库
-
查看数据库
show dbs
会显示所有数据库的名字以及大小
-
创建集合
db.createCollection("集合名",options)
参数说明
Options:可选参数(格式:{})
options可以是如下参数(以下参数都是可选)
字段 类型 描述 capped 布尔 默认false,如果true,则创建固定集合。固定几个是创建固定大小的集合,达到做大值得时候,会自动覆盖最早的文档。true时,必须指定size参数 autoIndexId 布尔 3.2之后不再支持该参数。如果true,自动在_id字段创建索引,默认为false size 数值 最大字节数,至少是256,当capped为true时才需要指定,一行文档的的大小不能超过最大字节数 max 数值 最大文档数量,当capped为true时并且指定了size属性才能指定 -
删除集合
- Show collections 查看当前数据库所有集合
- db.集合名.drop()
-
插入文档数据
# db.集合名.insert(文档内容) db.student.insert({ "name":"xxx", "age":18, "sex":"man" })
-
更新文档
#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:可选,抛出异常的级别。
-
删除文档
#db.collection.remove( # <query>, # { # justOne:<boolean>, # writeConcern:<document> # } #)
参数说明
- Query: (可选)删除文档的条件
- justOne:(可选)如果为true或1,则只删除一个文档
- writeConcern:(可选)抛出异常的级别。
-
查询文档
#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条
-
聚合管道查询
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不会显示出来。