mongodb不同于MySQL这种关系型数据库,它是一个基于分布式文件存储的Nosql数据库。mongodb支持的数据结构非常松散,可以通过json格式来修改插入数据。在mongodb中没有数据表,而是一个一个的collection集合。
基本操作
查看数据库
show databses
选择数据库
use database[数据库名称] 选择不存在的数据库会隐式创建该数据库
删除数据库
先选择到要删除的数据库 db.dropDatabase
查看集合
show collections
- 创建集合
>db.createCollection('c1')
- 删除集合
>db.集合名.drop()
数据库的增删改查操作
- 增
> 语法:db.集合名.insert(JSON数据)
> 集合存在,则直接插入数据,集合不存在,隐式创建并插入
> 当同时插入多条数据时,将多条数据用数组包裹,每条数据为一个json数据对象
> mongodb支持js的部分语法,可以使用for循环一次性插入多条数据
示例:
use test2
db.c1.insert({username:"xzy",age:18})
db.c1.insertMany({})
留心一:数据库和集合不存在时,都隐式创建
留心二:对象的键同意不加引号方便看,但是查看集合数据时系统会自动加上
留心三:mongodn会给每条数据添加一个全球唯一的ID
插入多条数据:
传递数组,数组中每个元素都是一个JSON类型
db.c1.insert([
{username:"z3",age:3},
{username:"z4",age:4},
{username:"z5",age:5}
])
插入十条数据:
for(var i=1;i<=10;i++){
db.c1.insert({username:"a"+i,age:i})
}
- 删
> 语法:db.集合名.remove(条件[,是否删除一条])
> 是否删除一条 true是,false否 默认为false
示例:
当存在多条符合条件的行时,只删除一条
db.c3.remove({username:"zs30"},true)
存在多条时,全部删除
db.c3.remove({username:"zs30"},false)
- 改
> 语法:db.集合名.update(条件,新数据[,是否新增,是否修改多条])
>是否新增:指条件匹配不到数据则插入,true是插入,false否不插入默认;是否修改多条:指将匹配成功的数据都修改(true是,false否默认)
示例:
db.c3.update({username:"zs1"},{username:"zs2"})#这样是替换,将符合条件的行直接换成这个
还可通过运算符来指定修改,运算符有:
运算符 | 作用 |
| ------- | ---- |
| rename | 重命名列 |
| unset | 删除列
更新不存在的值,若不存在则不会有操作。在最后加一个true参数,作用是,如果不存在,则插入该条数据,默认为false则不管。第四个参数如果为true,当匹配到多条条件符合的元素时,都更改,默认为false,只改一条
示例:
db.c4.update({username:"熊子阳"},{
$set:{username:"Aoi"},
$inc:{age:971},
$rename:{who:"sex"},
$unset:{other:true}
})
db.c3.update({username:"zs30"},{$set:{age:30}},true)
db.c3.update({},{$set:{age:20}},false,true)
- 查
语法:db.集合名.find(条件,[查询的列])
格式化:db.集合名.find().pretty()
db.findOne() 只返回查询结果的第一条;db.findMany() 返回多条
示例:
条件:
查询所有数据 {}或者不写
查询age=6的数据 {age:6}
查询age=6且性别为男 {age:6,sex:'男'}
查询的列
不写 - 查询全部的列
{age:1} 只显示age列,可以显示多个想要的列{user:1,age:1.......}
{age:0} 除了age列外都显示 可以不显示多个想要的列{user:0,age:0}
无论怎么写系统自定义_id都会在
也可以通过运算符来指定查询
运算符 | 作用 |
| ---- | ------ |
| $gt | 大于 |
| $gte | 大于等于 |
| $lt | 小于 |
| $lte | 小于等于 |
| $ne | 不等于 |
| $in | in |
| $nin | Not in
此时查询语法:
db.集合名.find({
键:{运算符:值}
})
示例:
年龄小于5的
db.c1.find({age:{$lt:5}})
年龄等于3、4、5的
db.c1.find({age:{$in:[3,4,5]}})
try catch
当一次性插入或者更新n条数据时,mongodb不会因为一条数据的错误而使得整个操作终止并回滚,只会终止接下来的操作,所以可以使用try catch来进行异常的捕捉处理。如下:
try{
db.c1.insertMany([
{"_id":1,name:"xzy"},
{"_id":2,name:"lhl"},
{"_id":3,name:"yzh"},
{"_id":4,name:"lwy"}...
}
])
}catch(e){
print
}
排序与分页
- 排序
语法:db.集合名.find().sort(JSON数据)
这里JSON数据的键就是要排序的列/字段,值为排序的方式:1升序,-1降序
示例:
db.c2.find().sort({age:-1})
- 分页
语法:db.集合名.find().skip(数字).limit(数字)
这里的skip为指定要跳过的数量,limit为限制查询的数量,两者结合实现分页的效果
示例:
db.c2.find().sort({age:-1}).skip(1).limit(2)
聚合查询
语法:db.集合名称.aggregate([{管道:{表达式}}....])
常用的管道有:
- match 过滤数据,只要输出符合条件的文档
- skip 跳过指定文档数
- $limit 限制集合数据返回文档数
常用表达式有:
- avg 平均
- max 最大值
示例:
_id 必须加,后跟指定列
男女生的总年龄
db.c3.aggregate([
{
$group:{
_id:"$sex",
res:{$sum:"$sex"}
}
}
])
求男女总人数
db.c3.aggregate([
{
$group:{
_id:"$sex",
res:{$sum:1}
}
}
])
求学生总数和平均年龄
db.c3.aggregate([
{
$group:{
_id:null,
res:{$sum:1},
total_avg:{$avg:"$age"}
}
}
])
查询男生女生人数,升序排序
db.c3.aggregate([
{$group:{ _id:"$sex",res:{$sum:1}}},
{$sort:{res:1}}
])
以上就是mongodb的一些基本增删改查操作。