MongoDB常用语句

Linux 安装 MongoDB

  1. 解压缩安装包,并重命名文件夹。

    tar zxvf mongodb-linux-x86_64-4.0.0.tgz
    mv mongodb-linux-x86_64-4.0.0 mongodb
    
  2. 配置环境变量 vim /etc/profile

    在 export PATH USER LOGNAME MAIL HOSTNAME HISTSIZE HISTCONTROL 一行的上面添加如下内容:
    #Set Mongodb
    export PATH=/usr/mongodb/bin:$PATH
    

    保存后通过下面的命令使环境变量生效:

    cd ~
    source /etc/profile
    
  3. 创建数据库目录

    cd /usr/mongodb
    touch mongodb.conf
    mkdir db
    mkdir log
    cd log
    touch mongodb.log
    
  4. 修改mongodb配置文件。vim /usr/mongodb/mongodb.conf

    port=27017 #端口 尽量自定义端口
    dbpath= /usr/mongodb/db #数据库存文件存放目录
    logpath= /usr/mongodb/log/mongodb.log #日志文件存放路径
    logappend=true #使用追加的方式写日志
    fork=true #以守护进程的方式运行
    maxConns=100 #最大同时连接数
    #noauth = true #不启用验证
    journal=true
    storageEngine=wiredTiger  #存储引擎
    bind_ip = 0.0.0.0  #这样就可外部访问
    auth = true #用户认证
    
  5. 设置文件夹权限

    cd /usr/mongodb
    chmod 777 db
    chmod 777 log
    
  6. 启动mongodb

    mongod --config /usr/mongodb/mongodb.conf
    
  7. 添加用户,设置密码

    //进入admin数据库
    use admin
    
    //给admin数据库添加管理员用户名和密码,用户名和密码请自行设置
    db.createUser({user:"admin",pwd:"admin123",roles:["root"]})
    
    //验证是否成功,返回1则代表成功
    db.auth("admin", "admin123")
    
    //切换到要设置的数据库,以test为例
    use test
    
    //为test创建用户,用户名和密码请自行设置。
    db.createUser({user: "test", pwd: "123456", roles: [{ role: "dbOwner", db: "test" }]})
    
    
    修改密码:
    登陆成功后,切换至admin表
    use admin
    db.changeUserPassword("用户名","新密码")
    
  8. 完成

MongoDB常用语句

  • 启动MongoDB

    win: mongod --dbpath=..\data\db
    linux: mongod --config mongodb.conf
    
  • 新建用户或修改用户密码

    db.addUser("java","java")
    
  • 查看所有用户

    db.system.users.find()
    
  • 进入数据库或创建数据库

    use test
    
  • 删除数据库

    db.dropDatabase()
    
  • 创建集合

    db.createCollection("mytest")
    
  • 删除集合

    db.mytest.drop()
    
  • 单个插入文档,insert 或者 save 都可以

    db.mytest.insert({"_id":1,"name":"小华","age":22,"sex":"男"})
    db.mytest.save({"name":"小魏","age":22,"sex":"男"})
    
  • 多个插入, 加中括号(数组)

    db.mytest.insert([{"name":"小华","age":223,"sex":"男"},{"name":"魏","age":26,"sex":"女"}])
    
  • 查询全部

    db.mytest.find()
    
  • 条件查询

    db.mytest.find({"name":"魏","sex":"男"})
    db.mytest.find({"_id":1}) // 手动输入的ID可以这样查
    
  • 如果id是mongdb自动生成的就需要这样查询

    db.mytest.find({"_id":ObjectId("61d14af84c260000ed002c7e")})
    
  • 投影查询

    db.mytest.find({"name":"魏","sex":"女"},{"name":0}) // 0是不显示name,其他都显示
    db.mytest.find({"name":"魏","sex":"女"},{"name":1}) // 1是只显示name和id,其他都不显示
    db.mytest.find({"name":"魏","sex":"女"},{"name":1,"_id":0}) // 只显示name,id也不显示,其他也都不显示
    
  • 插入数据时抓错

    try{
    db.mytest.insert([{"_id":1,"name":"小华","age":22,"sex":"男"},
    	{"_id":2,"name":"小魏","age":23,"sex":"女"},
    	{"_id":3,"name":"小蓝","age":24,"sex":"男"},
    	{"_id":4,"name":"小梁","age":25,"sex":"女"}
    ])}catch(e){
    	print(e)
    }
    
  • 覆盖更新,这个更新sex=nv ,但是除了id, 其他字段会变为空

    db.mytest.update({"_id":1},{"sex":"nan"})
    
  • 局部修改(常用)

    db.mytest.update({"_id":1},{$set:{"sex":"nv"}})
    
  • 批量修改, 就后面在加一个参数{multi:true},比较少用。用 updateMany就不用加这个参数

    db.mytest.update({"name":"小欣"},{$set:{"sex":"uuuu"}},{multi:true})
    
  • 列值增长的修改, age 字段 加1 ,如果要减1就改为-1

    db.mytest.update({"_id":1},{$inc:{"age":1}})
    
  • 删除数据

    db.mytest.remove({"_id":1}) // id为1的这条数据就被删除
    db.mytest.remove({"sex":"男"}) // sex为男的全部删除了
    db.mytest.remove({}) // 删除全部数据,等于清空集合, 小心使用
    
  • 统计查询, 共多少条记录

    db.mytest.count()
    
  • 查询sex为男的有多少条数据

    db.mytest.count({"sex":"男"})
    
  • 查询前2条数据

    db.mytest.find().limit(2)
    
  • 分页查询, 跳过第一页的2条数据,从第3条开始查, 拿到第3,4条数据

    // limit(2) 只显示2条, skip(2) 跳过前面两条开始查询
    db.mytest.find().limit(2).skip(2)
    
  • 排序查询, 1 为升序排序,-1是倒序

    // 如果排序汉字和字母,顺序是字母先,倒序是汉字先
    db.mytest.find().sort({"_id":-1})
    
  • 只显示id和name,如果{“name”:0}则除了name,其他字段全部显示

    db.mytest.find({},{"name":1}).sort({"_id":-1})
    
  • 正则查询, name 包含 魏 的都查询出来

    db.mytest.find({"name":/魏/})
    
  • 模糊查询, name 包含 魏 的都查询出来

    db.mytest.find({"name":{$regex:"魏"}})
    
  • 比较查询,gt大于,lt小于,gte大于等于,lte小于等于,ne不等于

    db.mytest.find({"age":{$gt:23}}) // 大于23
    db.mytest.find({"age":{$lt:23}}) // 小于23
    db.mytest.find({"age":{$gte:23}}) // 大于等于23
    db.mytest.find({"age":{$lte:23}}) // 小于等于23
    db.mytest.find({"age":{$ne:23}}).count({"_id":1}) // 不等于23
    
  • 不等于23的有多少条

    db.mytest.find({"age":{$ne:23}}).count({"_id":1})
    
  • 包含查询,name包含"小梁","小魏"都查出来

    db.mytest.find({"name":{$in:["小梁","小魏"]}})
    
  • name不包含"小梁","小魏"都查出来

    db.mytest.find({"name":{$nin:["小梁","小魏"]}})
    
  • and条件查询,age大于等于24和小于等于25

    db.mytest.find({$and:[{"age":{$gte:(24)}},{"age":{$lte:(25)}}]})
    简写:
    db.mytest.find({$and:[{"age":{$gte:24,$lte:25}}]}) (常用)
    
  • or条件查询,age大于等于25或者小于等于22

    db.mytest.find({$or:[{"age":{$gte:(25)}},{"age":{$lte:(22)}}]})
    简写:
    db.mytest.find({$or:[{"age":{$gte:24,$lte:25}}]}) (常用)
    
  • 查询集合中的索引

    db.mytest.getIndexes()
    
  • 创建索引,创建一个age升序索引,-1是降序

    db.mytest.createIndex({"age":1})
    
  • 创建唯一索引,创建唯一索引时,这个字段不能有重复的,不然会报错

    db.mytest.createIndex({"name":1},{unique:true})
    
  • 复合索引,age升序,sex降序

    db.mytest.createIndex({"age":1,"sex":-1})
    
  • 移除索引,按条件删,或者索引名字

    db.mytest.dropIndex({"age":1}) // 条件
    db.mytest.dropIndex("age_1_sex_-1") // 索引名称
    db.mytest.dropIndexes() // 删除所有索引,_id索引不会被干掉
    
  • 执行计划, 返回的数据里面有 "stage":"FETCH" 是用了索引查询

    db.mytest.find({"name":"小魏"}).explain()
    
  • test

    try{
    db.mytest.insert([{"_id":NumberInt(1),"name":"小华","age":22,"sex":"男","create_date":new Date()},
    	{"_id":NumberInt(2),"name":"小魏","age":23,"sex":"女","create_date":new Date()},
    	{"_id":NumberInt(3),"name":"小蓝","age":24,"sex":"男","create_date":new Date()},
    	{"_id":NumberInt(4),"name":"小梁","age":25,"sex":"女","create_date":new Date()}
    ])}catch(e){
    	print(e)
    }
    
    // Date() 显示当前的时间
    // new Date 构建一个格林尼治时间可以看到正好和Date()相差8小时,我们是+8时区,也就是时差相差8,所以+8小时就是系统当前时间
    // ISODate() 也是格林尼治时间
    
    // 插入当前时间,这样插入会比当前时间小8小时
    db.mytest.insert({"_id":NumberInt(5),"name":"小xx","age":22,"sex":"男","create_date":new Date()})
    
    
  • 时间查询 (我基本不用,都用字符串日期,个人喜好)

    db.mytest.find({"create_date":{$gt:ISODate("2022-01-03 15:32")}})
    // (比较少用) 
    db.mytest.find({"create_date":{$gt:new Date("2022-01-03T15:31:20.24Z")}})
    
    db.mytest.find({$and:[{"create_date":{$gt:ISODate("2022-01-03 15:32")}},{"create_date":{$lt:ISODate("2022-01-03 15:33")}}]})
    // 简写
    db.mytest.find({$and:[{"create_date":{$gt:ISODate("2022-01-03 15:32"),$lt:ISODate("2022-01-03 15:33")}}]})
    
    db.msg_detail.find({$and:[{"create_time":{$gt:"2022-01-15 00:00:00"}},{"create_time":{$lt:"2022-01-16 00:00:00"}}{"user_id":NumberLong(27566)}]})
    
  • mongodb 添加字段并设置默认值

    db.doc名称.update({}, {$set: {新字段名称: 默认值}}, false, true)
    如:db.fly_bill.update({}, {$set: {usableStatus: "0"}}, false, true)
    
  • 数字字符串排序

    db.aaa.find().collation({"locale":"zh", "numericOrdering":true}).sort({"id":-1}).pretty()
    或
    db.aaa.find().collation({"locale":"zh", "numericOrdering":true}).sort({"id":-1})
    
  • 递归查询

    db.test01.find({"result.allCalls.source":"2019年报"})
    或
    db.test01.find({"result.allCalls":{$elemMatch:{"source":"2019年报"}}})
    
  • 去重

    db.user_profile_search_keyword.distinct("keyword")
    或
    db.getCollection("user_profile_search_keyword").distinct("keyword")
    
    $eq = (等于)
    $gt > (大于)
    $gte >= (大于等于)
    $lt < (小于)
    $lte <= (小于等于)
    $ne != (不等于)
    $in in (in)
    $nin !in (not in)
    
  • 正则匹配,包含,不包含

    db.xxx.find({$and:[{"name":/深圳|鹤山/},{"name":/^((?!五金|管理).)*$/},{"base":{$in:["广东","天津"]}},{"create_time":{$gte:"2022-03-10 21:20:15",$lte:"2022-03-10 21:21:15"}}]},{"name":1,"base":1,"create_time":1})
    
    db.xxx.find({$and:[{"name":{$regex:"深圳|鹤山|广东"}},{"name":/^((?!五金|人力).)*$/}]},{"name":1})
    
    db.tyc_company_search.find({$and:[{$or:[{$and:[{"name":/深圳|广州/},{"name":/^((?!五金|人力).)*$/}]},{$and:[{"base":/深圳|广州/},{"base":/^((?!五金|人力).)*$/}]}]},{},{}]},{"name":1,"base":1})
    

mongodb 数据库备份

  • 一种是针对于库的mongodump和mongorestore,

  • 一种是针对库中表的mongoexport和mongoimport

  • mongodump备份数据库

    命令参数:
    	mongodump -h IP --port 端口 -u 用户名 -p 密码 -d 数据库 -o 文件存在路径
    
    示例:
    导出所有数据库
        mongodump -h 127.0.0.1 -o /home/mgtc/mongodb/
    
    导出特定数据库
        mongodump -h 127.0.0.1 -d wooyun -o /home/mgtc/mongodb/
    
  • mongorestore还原数据库

    命令参数:
        mongorestore -h IP --port 端口 -u 用户名 -p 密码 -d 数据库 --drop 文件存在路径
    
    –drop参数:先删除所有的记录,然后恢复
    
    还原所有数据库到mongodb中
    示例:
          mongorestore /home/mgtc/mongodb/  #这里的路径是所有库的备份路径
    
          mongorestore --drop /home/mgtc/mongodb/  #删除在还原所有库
    
    还原指定的数据库
          mongorestore -d wooyun /home/mgtc/mongodb/wooyun/
    
  • mongoexport导出表,或者表中部分字段

    命令参数:
    mongoexport -h IP --port 端口 -u 用户名 -p 密码 -d 数据库 -c 表名 -f 字段 -q 条件导出 --csv -o 文件名
    参数:
    -f 导出指字段,以字号分割,-f name,email,age导出name,email,age这三个字段
    -q 可以根查询条件导出,-q ‘{ “uid” : “100” }’ 导出uid为100的数据
    –csv 表示导出的文件格式为csv
    
    示例:
    导出整张表
    mongoexport -d wooyun -c users -o /home/mgtc/mongodb/wooyun/user.dat
    
    导出某些字段
    mongoexport -d wooyun -c users --csv -f name,uuid -o /home/mgtc/mongodb/wooyun/user.csv
    
    根据条件导出
    mongoexport -d wooyun -c users -q '{uuid:{$gt:1}}' -o /home/mgtc/mongodb/wooyun/user.json
    
  • mongoimport导入表,或者表中部分字段

    命令参数:
        mongoimport -h IP --port 端口 -u 用户名 -p 密码 -d 数据库 -c 表名 --upsert --drop 
    
    –upsert: 插入或者更新现有数据
    
    还原整表导出的非csv文件
          mongoimport -d wooyun -c users --upsert users.dat
    
    还原部分字段的导出文件
          mongoimport -d wooyun -c users --upsertFields name,uuid users.dat
    
    还原导出的csv文件
          mongoimport -d wooyun -c users --type csv --headerline --file users.csv
    
  • Linux 自动备份 MongoDB

    mkdir -p /home/backup/mongod_bak/mongod_bak_now
    mkdir -p /home/backup/mongod_bak/mongod_bak_list
    

    vim /mongodb_bak.sh

    mongodb_bak.sh 文件如下:
    #!/bin/sh
    
    DUMP=/usr/mongodb/bin/mongodump # mongodump备份文件执行路径
    
    OUT_DIR=/home/backup/mongod_bak/mongod_bak_now # 临时备份目录
    
    TAR_DIR=/home/backup/mongod_bak/mongod_bak_list # 备份存放路径
    
    DATE=`date +%Y_%m_%d` # 获取当前系统时间
    
    DB_USER=admin # 数据库账号
    
    DB_PASS=password # 数据库密码
    
    DAYS=7 # DAYS=7代表删除7天前的备份,即只保留最近7天的备份
    
    TAR_BAK="mongod_bak_$DATE.tar.gz" # 最终保存的数据库备份文件名
    
    cd $OUT_DIR
    
    rm -rf $OUT_DIR/*
    
    mkdir -p $OUT_DIR/$DATE
    
    # $DUMP -u $DB_USER -p $DB_PASS -o $OUT_DIR/$DATE # 备份全部数据库
    
    $DUMP -o $OUT_DIR/$DATE # 备份全部数据库
    
    tar -zcvf $TAR_DIR/$TAR_BAK $OUT_DIR/$DATE # 压缩为.tar.gz格式
    
    find $TAR_DIR/ -mtime +$DAYS -delete # 删除7天前的备份文件
    

    chmod u+x mongodb_bak.sh # 给.sh文件添加x执行权限

    最后把 mongodb_bak.sh 放到 Linux 定时任务里

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值