MongoDB

安装

编写docker-compose.yml

version: '3'
services: 
  mongo:
    image: mongo
    restart: always
    container_name: mongo
    environment:
      MONGO_INITDB_ROOT_USERNAME: root
      MONGO_INITDB_ROOT_PASSWORD: 123456
    ports:
      - 27017:27017
    volumes:
      - /usr/local/docker/mongo/data:/data/db
      - /etc/localtime:/etc/localtime
    networks:
      - webservice_web-service
  mongo-express:
    image: mongo-express
    restart: always
    container_name: mongo-express
    ports:
      - 38081:8081
    environment:
      ME_CONFIG_MONGODB_ADMINUSERNAME: root
      ME_CONFIG_MONGODB_ADMINPASSWORD: 123456
    networks:
      - webservice_web-service

networks:
  webservice_web-service:
    external: true

2.使用mongodb

use admin -- 创建admin数据库
db.auth("root", "123456") -- 认证
-- 添加用户
db.createUser(
  {
    user: "kexianjun",
    pwd: "123456",
    roles: [ { role: "userAdminAnyDatabase", db: "admin" } ]
  }
)
-- 添加普通用户
use yncjtz -- 创建yncjtz数据库
db.createUser(
  {
    user: "kexianjun",
    pwd: "123456",
    roles: [ { role: "readWrite", db: "yncjtz" },
             { role: "read", db: "bar" } ]
  }
)
-- 权限:读写数据库 foo, 只读数据库 bar。
-- Read:允许用户读取指定数据库
-- readWrite:允许用户读写指定数据库
-- dbAdmin:允许用户在指定数据库中执行管理函数,如索引创建、删除,查看统计或访问system.profile
-- userAdmin:允许用户向system.users集合写入,可以找指定数据库里创建、删除和管理用户
-- clusterAdmin:只在admin数据库中可用,赋予用户所有分片和复制集相关函数的管理权限。
-- readAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的读权限
-- readWriteAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的读写权限
-- userAdminAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的userAdmin权限
-- dbAdminAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的dbAdmin权限。
-- root:只在admin数据库中可用。超级账号,超级权限
-- 注:必须用root角色才可以实现全部功能

连接数据库

-- 有密码
mongodb://root:[email protected]:27017/yncjtz 
-- root是用户名
-- 123456是密码
-- yncjtz是数据库名

-- 无密码连接
mongodb://192.168.10.10:27017/admin

3.操作mongodb

db.createCollection('stu')
show collections
show dbs
db.stu.drop() #删除stu集合
db.集合名.remove({条件}) #删除
db.stu.insert({name:"kexianjun",age:28}) #插入
db.stu.find()#查询
db.stu.update({},{$set:{name:ke}},{multi:true}) #第一个参数是查询,第二个参数是修改后的内容 第三个是不是修改所有,默认只修改第一条 此句的意思是把kexianjun改为ke
db.集合名.save({}) #修改或者保存
db.createCollection('sub',{capped:true,size:10}) #sub是集合名,sub的数据只会有10条,多了会覆盖
db.集合名.find({条件}) 
db.stu.findOne({})
db.sub.find({title:'mongodb'}).pretty() #查询title=mongodb的数据,查出来的json数据会格式化
$lt:< 小于 
$gte:>= 大于等于
$ne:!= 不等于
$or:| 或者
$in:{} 在什么范围内
$nin:{} 不在什么范围
db.sub.find({$or:[{title:'css'},{count:{$gt:2}}])
db.stu.find({name:/^g/}) #查询以g开头的name 支持正则
db.stu.find({name:{$regex:'^黄'}}) #以黄开头的name
skip#跳过n条数据 
limit  #显示n条数据
db.stu.find().skip(1).limit(1) #跳过第一条显示1条数据
db.stu.find({},{name:1,_id:0}) #第一个参数是查询条件,第二个是需要显示的内容 这里只显示name 不显示id

自定义查询js语法(重点)

db.stu.find({
    $where:function(){
        return this.age>20
    }
})  #里面写的是js语法 return返回bool值(条件)

排序sort()升序用1,降序用-1

db.stu.find.sort({name:1,age:-1}) #根据name升序,age降序

count()统计个数

db.stu.count({})

去除重复distinct()

db.stu.distinct('去重字段',{条件})

聚合相当于linux中的管道aggregate

db.stu.aggregate([{管道:{表达式}])
#管道有:
$group #分组统计结果
$match #过滤数据
$project #修改数据文档的结构 和find中的第二个参数的作用一样
$sort #排序后输出
$limit #限制输出数据
$skip #跳过制定数量的文档
$unwind #拆分数组显示,push是合并成数组
db.stu.aggregate([
    {$group:
        {_id:'$gender',counter:{$sum:'$age'}}
    }
])
db.stu.aggreate([
    {$match:{age:{$gt:20}}},
    {$group:{_id:'$gender',counter:{$sum:1}}},
    {$project:{_id:0,counter:1}},
    {$sort:{_id:-1}},
    {$skip:1},
    {$limit:5}
])
db.stu.aggreate([
    {$unwind:'$size'}
]) #size:['M',"L",'X'] 会被拆分成三条数据显示
db.stu.aggregate([
    {$unwind:{path:'$字段名称'},preserveNullAndEmptyArrays:true}
]) #preserveNullAndEmptyArrays可以阻止数据丢失 上面的会把空数据丢失
db.stu.aggregate([
    {$group:{_id:'gender',counter:{$sum:1},docs:{$push:'$$Root'}}},
    {$project:{_id:0,counter:1,docs:1}},
    {$unwind:'$docs'}
])

表达式

表达式:'$列名'
$sum
$avg
$min
$max
$push
$first
$last
db.stu.aggregate([
    {$group:
        {_id:'$gender',counter:{$push:'$$ROOT'}}
    }
])

索引

db.集合名.ensureIndex({属性:1}) -- 给属性建立索引
db.t1.ensureIndex({name:1})
--唯一索引
db.t1.ensureIndex({name:1},{"unique":true}) 
-- 多个属性建立索引
db.t1.ensureIndex({name:1,age:1})
db.t1.getIndexes() --查看文档索引
db.t1.dropIndexes('索引名称') --删除索引

创建超级用户

--系统角色有三种 root Read readWrite
use admin
db.createUser({
 user:'admin',
 pwd:'123456',
 roles:[{role:'root',db:'admin'}]
}) --user是用户名 db是数据库名 pwd是密码 role是角色

你可能感兴趣的:(MongoDB)