基本使用
ps: 启动mongodb服务器
service mongod start
停止mongodb服务器
service mongod stop
重启mongod服务器
service mongod restart
查看端口使用情况
netstat -ntlp
mongodb没有表的概念,其他数据库所谓的表在这里叫做集合
数据库不需要手动创建,当你use db_name ,并向其中插入数据后,系统会自动创建
显示所有的数据库
show dbs/show databases
查看当前所在的数据库位置
db
切换数据库
use db_name
删除当前的数据库
db.dropDatabase()
集合也不需要手动创建,当你想集合中插入数据后,系统会自动向创建集合
手动创建集合
db.createCollection(name, options)
显示所有集合
show collections
删除集合
db.coll_name.drop()
数据类型:
类型 | 说明 |
---|---|
Object ID | 文档ID |
String | 字符串,必须是有效的UTF-8 |
Boolean | 布尔类型,true或false |
Double | 浮点值 |
Integer | 32位或者64位的整数 |
Arrays | 数组或列表,多个值存储到一个键 |
Null | 空值 |
Object | 用于存储嵌入式的文档 |
Timestamp | 时间戳,表示从1970-1-1到现在的秒数 |
Date | 存储当前日期或时间的Unix时间格式 |
插入数据
db.coll_name.insert(data)
插入文档时,如果不指定_id参数,系统会自动为文档分配一个唯一的ObjectID
不能有重复的ObejctID
db.colle_name.save(data)
如果插入重复的Obejct_ID,则对应的数据会修改
如果没有,会插入数据
更新操作
db.coll_name.update({指定的数据},{更改后的数据}) //会把整条数据都改为后面的数据
db.coll_name.update({指定的数据},{$set{更改后的数据}}) //会把指定的键更改,别的键不受影响
::在默认情况下,update只会更新第一条数据
db.coll_name.update({指定的数据},{更改后的数据},{multi:true}) //这样的话,在更改后,会直接将所有符合条件的数据都更新
删除操作
db.coll_name.remove({指定的数据}) //默认删除所有的符合条件的数据
db.coll_name.remove({指定的数据},{justOne:true}) //只删除第一条,默认情况下是false
运算符 | 意义 |
---|---|
等于 | 默认就是等于,所以没有运算符 |
$lt(less than) | 小于 |
$lte(less than equal) | 小于等于 |
$gt(greater than) | 大于 |
$gte(greater than equal) | 大于等于 |
$ne(not equal) | 不等于 |
简单查询
db.coll_name.find()
db.coll_name.find({指定的条件}) //返回所有的符合条件的
db.coll_name.find({指定的条件}).pretty() //格式清晰的输出
db.coll_name.findOne({指定的条件}) //返回符合条件的第一条
db.coll_name.find().sort({age:1}) //升序,-1为降序
// 如果在返回时,我们不想要全部的字段,只想要部分字段,可以将需要的字段设置为1
// id是默认显示的,如果不想显示设置为 _id:0
db.coll_name.find({指定的条件},{name:1})
比较查询
db.coll_name.find({age:{$lt:18}}) //coll_name集合中,age小于18的
db.coll_name.find({age:{$lte:18}}) //coll_name集合中,age小于等于18的
db.coll_name.find({age:{$in:[18,28,38]}}) //age等于18或28或38的
or和and操作
db.coll_name.find({"name":"wang","gender":"men"}) //查询name=wang,gender=men的数据
db.coll_name.find({$or:[{"name":"wang"},{"gender":"men"}]}) //查询name=wang或者gender=men的数据
db.coll_name.find({$or:[{age:{$gt:20}},{address:{$in:["henan","hebei"]}}]}) //age>20或者address是henan或者hebei的
正则表达式
db.coll_name.find({"name":/正则表达式/})
db.coll_name.find({"name":{$regex:"正则表达式"}})
skip和limit操作
db.coll_name.skip(3) //跳过前3个
db.coll_name.limit(3) //选中前3个
自定义查询
db.coll_name.find({$where:function(){
// 自定义js部分
return this.age>18
}})
db.coll_name.find().count() //统计个数
db.coll_name.distinct("字段",{条件}) //去重
数据备份
mongodump -h dbhost -d dbname -o directory
-h 服务器地址,也可以指定端口号(本机就不需要指定)
-d 需要备份的数据库名称
-o 备份的数据存放的位置
数据恢复
mongorestore -h dbhost -d dbname --dir directory
-h 服务器地址,也可以指定端口号(本机就不需要指定)
-d 需要恢复的数据库实例
--dir 备份的数据库所在的位置
聚合(aggregate)
聚合是基于数据处理的聚合管道,每个文档通过一个由多个阶段组成的管道,可以对每个阶段的管道进行分组,过滤等功能,然后经过一系列的处理,输出相应的结果。
常用的管道
命令 | 用途 |
---|---|
$group | 将集合中的文档分组,可用于统计结果 |
$match | 过滤数据,只输出符合数据的文档 |
$project | 修改输入文档的结构,如重命名,增加,删除,修改字段 |
$sort | 将输入文档排序后输出 |
$limit | 限制聚合管道输出的文档数 |
$skip | 跳过指定数量的文档,并输出余下的文档 |
$unwind | 将数组类型的字段进行拆分 |
常用的表达式
表达式 | 用途 |
---|---|
$sum | 计算总和,$sum:1表示以一倍计数 |
$avg | 计算平均值 |
$min | 计算最小值 |
$max | 计算最大值 |
$push | 在结果文档中插入值到一个数组中 |
$first | 根据资源文档的排序获取第一个文档的数据 |
$last | 根据资源文档获取最后一个文档的数据 |
db.coll_name.aggregate(
{$match:{age:{$gt:12}}}, //先匹配age大于12的数据
{$group:{_id:"address",avg_age:{$avg:"$age"}}}, //通过address进行分组,并求出来平均值,如果_id:null,就是对整个文档操作
{$project:{_id:0,avg_age:1}}, //可以对上一个管道传过来的数据进行操作,确定哪个显示或不显示
{$sort:{avg_age:1}} //将结果升序输出
)
db.coll_name.insert({_id:20190899,"item":"T-shirt","size":[S,M,L,XL]}) // 将包含数组类型的值插入
db.coll_name.aggregate(
{$unwind:"$size"} //会直接将查询出来的结果进行拆分
)
输出:
{_id:20190899,"item":"T-shirt","size":"S"}
{_id:20190899,"item":"T-shirt","size":"M"}
{_id:20190899,"item":"T-shirt","size":"L"}
{_id:20190899,"item":"T-shirt","size":"XL"}
但是:unwind遇到size为空或者没有size属性的值时,会舍弃整条数据
我们需要添加一个参数:
preserveNullAndEmptyArrays:true
索引
建立索引
db.coll_name.ensureIndex({"name":1})
db.coll_name.ensureIndex({"name":1},"unipue":true) //索引值是唯一的
建立联合索引
查看所有的索引
db.coll_name.getIndexes()
删除索引
db.coll_name.dropIndex("索引名称")