数据库操作
show dbs; //显示数据库列表(注意,无集合的数据库不显示)
db; //显示当前正在使用的数据库
use dbname; //如果存在,则切换至数据库,如果不存在,创建后切换至数据库
show tables; //展示当前库中的集合列表
show collections; //同上
db.dropDatabase(); //删除当前数据库
集合操作
db.cretaeCollection(name, options); //创建数据库 name:数据库名称 options:选项
//options {
// capped : false|true 是否限制集合大小
// size : 100 当文档达到上限时,会覆盖之前的数据,
// 单位为字节
//}
db.collection_name.drop(); //删除当前库的collection_name集合
文档简单操作
db.collection_name.insert({"name":"renling"});
// 插入数据,如果不存在collection_name的集合,则会自动创建
db.collection_name.find();
db.collection_name.find().pertty();
// 查询collection_name中的所有数据,pertty将会格式化显示
db.collection_name.update(where_json, data_json);
// 全量修改数据,会将匹配到的整体JSON替换为data_json数据
db.collection_name.update(where_json, {'$set' : data_json});
// 非全量修改数据
db.collection_name.remove(where_json);
// 删除数据
高级操作(where_json部分)
//比较查询
{"name":"xiaogang.cui"} //等于运算符
{"age":{'$gt':15}} //$gt 大于运算符
{"age":{'$lt':15}} //$lt 小于运算符
{"age":{'$gte':15}} //$gte 大于等于运算符
{"age":{'$lte':15}} //$lte 小于等于运算符
{"age":{'$ne':15}} //$ne 不等于运算符
{"age":{'$gt':15,'$lt':22}} //组合操作
//IN|NOT IN 查询
{"age":{'$in', [11,23,45]}}
{"age":{'$nin', [11,23,45]}}
//size 查询
// 前提是data是个对象或者数组
{"data":{'$size' : 12}} //data有12个元素
{"data":{'$size':{'$gt':4}}}; //data的元素个数大于4个
//是否存在某个健明 //true 表示存在 false 表示不存在
{"age":{$exists:true}}
{"age":{$exists:true, $eq:12}}
//OR 条件
{$or: [{"age":18}, {"name":"xiaogang.cui"}]}
{$or: [{"age":{$gt:20}}, {"age":{$lt:18}}]}
//正则匹配(模糊查询)
{"age":{$regex:/^\d+$/}}
{"name":/^\.*\d+$/}
高级操作(其他操作)
//排序 1-升序 2-降序
db.collection_name.find().sort({"age":1, "time":-1});
//限制输出
db.collection_name.find().limit(10); //只取前10条数据 = limit 10
db.collection_name.find().skip(10).limit(10); //取10后的前10条 = limit 10,10
MongoDB的数据类型
- ObjectID 文档ID,是一个12字节的十六进制数
- String 字符串,必须是有效的UTF-8
- Boolean 布尔
- Integer 整形,可以使32或64位,取决于服务器
- Double 浮点型
- Arrays 数组或列表
- Object 嵌入式的文档
- Null
- Timestamp 时间戳
- Date 存储当前的日期或时间的UNIX时间格式
聚合命令
语法:db.collection_name.aggregate([{"管道符":{表达式}}])
常用管道
- $group 讲集合中的文档进行分组,可用于统计结果
- $match 过滤数据,只输出符合条件的文档
- $project 修改输入文档的结构,如:重命名、增加、删除、创建计算结果等
- $sort 将输入文档排序后输出
- $limit 限制聚合管道返回的文档数
- $skip 跳过指定数量的文档
- $unwind 将数组类型的字段进行拆分
常用表达式
- $sum 计算综合, 需要注意的是{$sum:1} 相当于求得数据的数量 count
- $avg 计算平均值
- $min 获取最小值
- $max 获取最大值
- $push 在结果文档中插入到一个数组中
- $first 根据资源文档的排序获取第一个文档数据
- $last 根据资源文档的排序获取最后一个文档数据
//核心语法
db.collection_name.aggregate([
{管道1: {表达式1}},
{管道2: {表达式2}},
{管道3: {表达式3}}
])
//$limit 限制输出的数据条数
db.collection_name.aggregate({$limit:3});
分组查询(特殊)
//$group 分组查询
db.collection_name.aggregate(
{$group:
{
_id : '$字段名', //根据某个字段进行分组 group by field
别名 : {聚合函数:'$字段名'} //计算的数据
}
}
);
//分组查询年龄之和
db.collection_name.aggregate(
{$group: {
_id:'$name',
'total_age':{$sum:'$age'}
}}
);
//_id 为null代表不分组
db.collection_name.aggregate(
{$group: {
_id:null,
"平均年龄":{$avg:'$age'},
"数据条数":{$sum:1}
}}
);
//$push 进行拼接操作
db.collection_name.aggregate(
{$group: {
_id : '$sex',
'count' : {$sum:1},
"名单" : {$push:'$name'}
}}
);
// $first $last 按照分组排序获取第一、最后的数据
db.collection_name.aggregate({
$group:{
_id:'$sex',
"小组第一个人":{$first:'$name'},
"小组最后一个人":{$last:'$name'}
}
});
其他管道应用
//年龄大于30的数据 $match 过滤数据
db.collection_name.aggregate({
$match:{"age":{$gt:30}}
});
//对过滤后的数据进行分组
db.collection_name.aggregate([
{$match:{"age":{$gt:30}}},
{$group:{_id:null, 'count':{$sum:1}}}
]);
//限定字段的管道符 $project
db.collection_name.aggregate({
$project:{"_id":0, "name":1,"sex":0,"age":1} //1 显示 0 不显示
});
//排序 $sort
db.collection_name.aggregate({
$sort: {
"age":1
}
}); //按年龄从小到大
//限制输出 $limit $skip
db.collection_name.aggregate([
{$sort:{"age":1}},
{$limit:10},
{$skip:10}
]);
//数组进行拆分 $unwind
//只针对数组有作用,拆分后,1条数据将会变为数组个数的数据条数
db.users.aggregate([
{$match:{"data":{$exists:true}}},
{$unwind:"$data"}
]);
数据库安全
- 首先以无密码形式登录
- 创建管理员密码,
use admin;
//添加一个超级管理员
db.createUser({user:"admin",pwd:"password",roles:["root"]});
- 验证密码
// 必须在admin库下才能正常执行
db.auth('admin', 'password');
- 重启mongodb服务(不单单只是重启,如果安装了windows的服务,需要重新安装windows服务)
//关闭mongo服务,然后重新启动
mongod --dbpath "d:\mongodb\db\" --logpath "d:\mongo\log\mongo.log" --auth
//如果安装了MongoDB的windows服务,需要先卸载windows服务
//需要确定windows服务的名称是否为mongodb
net stop mongodb
sc delete mongodb
mongod --dbpath "d:\mongodb\db\" --logpath "d:\mongo\log\mongo.log" --install --serviceName "MongoDB" --auth
注意,开启了验证用户身份(--auth)匿名用户仍然可以登录,但是不能查询、操作任何数据。
- 为某个库添加指定的管理员,添加的管理员只能访问某个库
db.createUser({user:"root",pwd:"root", roles:[role:"dbOwner", db:"db_name"]});