一、创建用户
- 创建管理员账户
//以--auth启动数据库服务器
mongod --dbpath=C:\data\shard\test --port 27000 --auth
//以admin登录且切换到admin数据库
mongo admin --port 27000
//创建管理员
db.createUser({user:"root",pwd:"12345",roles:["userAdminAnyDatabase"]})
//登录
db.auth("root","12345")
- 创建用户账户
一般我们用于连接使用的就是用户账户,用户帐户对集合拥有读写删除的权限,但是没有删除数据库的权限。
//以管理员账户切换到需要创建用户的数据库
use test
//创建用户账户
db.createUser({user:"testuser",pwd:"12345",roles:["readWrite"]})
read:读权限
write:写权限
readWrite:读写权限
十四、聚合aggregate
文档类型:
uid | ip | timestamp |
---|---|---|
“23534643” | “192.168.1.138” | “1522334524” |
- 使用$group
//以uid分组,查询uid和统计条数以num为域显示,类似sql语句的select uid,count(*) as num from tb group by uid;
db.loginHistory.aggregate([{$group:{_id:"$uid",num:{$sum:1}}}])
//以uid分组,查询uid和统计timestamp最小值以num为域显示,类似sql语句的select uid,min(timestamp) as num from tb group by uid;
db.loginHistory.aggregate([{$group:{_id:"$uid",num:{$min:"$timestamp"}}}])
表达式 | 作用描述 | 使用例子 |
---|---|---|
$sum | 计算总和。 | db.loginHistory.aggregate([{$group : {_id : “\$uid”, num : {\$sum : “\$uid”}}}]) |
$avg | 计算平均值 | db.loginHistory.aggregate([{$group : {_id : “$uid”, num : {$avg : “$timestamp”}}}]) |
$min | 获取集合中所有文档对应值得最小。 | db.loginHistory.aggregate([{$group : {_id : “$uid”, num : {$min : “$timestamp”}}}]) |
$max | 获取集合中所有文档对应值得最大值。 | db.loginHistory.aggregate([{$group : {_id : “$uid”, num : {$max : “$timestamp”}}}]) |
$push | 结果文档中插入值到一个数组中。 | db.loginHistory.aggregate([{$group : {_id : “$uid”, url : {$push: “$url”}}}]) |
$addToSet | 在结果文档中插入值到一个数组中,但不创建副本。 | db.loginHistory.aggregate([{$group : {_id : “$uid”, url : {$addToSet : “$url”}}}]) |
$first | 根据资源文档的排序获取第一个文档数据。 | db.loginHistory.aggregate([{$group : {_id : “$uid”, first_url : {$first : “$url”}}}]) |
$last | 根据资源文档的排序获取最后一个文档数据 | db.loginHistory.aggregate([{$group : {_id : “$uid”, last_url : {$last : “$url”}}}]) |
- 使用$project
//只显示域uid和timestamp,类似sql的select uid,timestamp from loginHistory;
db.loginHistory.aggregate({$project:{uid:1,timestamp:1}})
//不显示_id域
db.loginHistory.aggregate({$project:{_id:0,uid:1,timestamp:1}})
- 使用$match,类似于sql的having
//匹配timestamp大于等于1502097028352的文档,类似sql的select uid,min(timestamp) from loginHistory group by uid having timestamp >= 1502097028352;
db.loginHistory.aggregate([{$match:{timestamp:{$gte:"1502097028352"}}},{$group:{_id:"$uid",min:{$min:"$timestamp"}}}])
- 使用$skip跳过指定条数文档
//跳过1条文档类似sql的select uid,min(timestamp) from loginHistory group by uid having timestamp >= 1502097028352 limit 1;
db.loginHistory.aggregate([{$match:{timestamp:{$gte:"1502097028352"}}},{$group:{_id:"$uid",min:{$min:"$timestamp"}}},{$skip:1}])