数据库-mongoDB-基础

-----启动MongoDB----
1.命令行下运行 MongoDB 服务器
  纯命令启动
    ..>mongod --dbpath E:\mongodb\data\db --logpath E:\mongodb\data\log\mongod%date:~0,4%%date:~5,2%%date:~8,2%.log
  配置文件启动
    ..>mongod -f "E:\mongodb\mongod.cfg"

  mongod.cfg配置如下:
    systemLog:
    destination: file
    path: E:\mongodb\data\log\mongod.log
    storage:
    dbPath: E:\mongodb\data\db
2.连接MongoDB
  ..>mongo.exe


-----数据库操作----
---进入MongoDB---
  注:默认位置为test数据库
  use mytest
    -----进入数据库mytest(没有则添加数据库)
  db.dropDatabase()
    -----删除当前数据库
  show dbs
    -----查看所有数据库
---表操作----
  db.createCollection("mycol",{capped:true,autoIndexId:true,size :6142800,max:10000})
    -----创建固定集合(类似于表) mycol,自动在 _id 字段创建索引,整个集合空间大小 6142800 KB, 文档最大个数为 10000 个。
    注:在 MongoDB 中,你不需要创建集合。当你插入一些文档时,MongoDB 会自动创建集合。
  db.my.drop()
    ---删除集合my
  show tables
    -----查看所有集合(表)或者命令【show collections】
-----增加数据----
  db.my.insert({"name":"菜鸟教程"})
    ----插入数据
  db.my.insertOne({"a": 3})
    ------向指定集合中插入一条文档数据
  db.my.insertMany([{"b": 3}, {'c': 4}])
    -----向指定集合中插入多条文档数据
-----删除文档-----
  db.col.remove(条件,默认删除所有)
  db.col.remove({'title':'教程'},1)删除title为教程的第一条数据
  db.col.remove({'title':'教程'})删除所有title为教程的数据
  db.col.remove({})删除所有数据
  db.repairDatabase()删除后来回收磁盘空间
  -----新版--------
  db.inventory.deleteMany({})删除集合下全部文档:
  db.inventory.deleteMany({status:"A"})删除status等于A的全部文档:
  db.inventory.deleteOne({status:"D"})删除status等于D的一个文档:
-----查询数据-----
-----设置格式----
  db.my.find()
  db.my.find().pretty() 格式化数据
  db.collection.find(query,{_id:0,title:1,by:1})//显示title和by字段,隐藏_id字段(只有_id可以指定为0隐藏和1显示
  db.collection.find(query,{title:0,by:0})//隐藏title和by字段,显示其它字段
-----设置条件----
1.and
  db.col.find({"by":"菜鸟教程","title":"教程"})
    ----whereby='菜鸟教程'andtitle='教程'
2.or
  db.col.find({$or:[{"by":"菜鸟教程"},{"title":"MongoDB教程"}]})
    ----whereby='菜鸟教程'ortitle='MongoDB教程'
3.and+or
  db.col.find({"likes":{$gt:50},$or:[{"by":"菜鸟教程"},{"title":"MongoDB教程"}]})
    ----where likes>50 and (by='菜鸟教程' or title='MongoDB教程')
4.符号
  db.posts.find({qty:{$gt:50,$lt:80}})
    ----where qty>50 and qty<80
-----附表-----
  (>)大于-$gt
  (<)小于-$lt
  (>=)大于等于-$gte
  (<=)小于等于-$lte
  (!=)不等于-$ne
  (=)等于-$eq
  查询title包含"教"字的文档:db.col.find({title:/教/})
  查询title字段以"教"字开头的文档:db.col.find({title:/^教/})
  查询title字段以"教"字结尾的文档:db.col.find({title:/教$/})
-----设置分页----
  db.test.find({amount:{$gt:23}}).sort({"amount":1}).skip(1).limit(10)
    --------find条件查询amount>23.
    sort指定amount排序(1为升-1为降),
    skip设置跳过第一条数据,
    limit表示显示10条记录,
  注:查询优先级为:排序sort>跳过skip>显示limit
  skip是在内存中一条一条数的,数值越大越不要用
-----更新文档-----
1.update
  db.collection.update(
    <query>, ---查询条件,类似where
    <update>, ---更新条件,类似set后面的
    {
      upsert:<boolean>, ---可选,不存在记录时是否插入新记录,【false(默认):不插入,true:插入】
      multi:<boolean>, ---可选,【false(默认):更新第一条记录,true:更新全部记录】
      writeConcern:<document> ---可选,抛出异常的级别
    }
  )

  db.my.update({'name':'MongoDB教程'},{$set:{'name':'MongoDB'}},{multi:true})
    ----更新集合my中name为‘MongoDB教程’的第一条数据name为'MongoDB'
  -----新版--------
  db.my.updateOne()向指定集合更新单个文档
  db.my.updateMany()向指定集合更新多个文档
2.save
  db.col.save({"_id":ObjectId("123"),"title":"MongoDB"})
    ----修改ID为‘123’的字段title为MongoDB,如果不存在则插入数据
-----速度优化----
  db.col.createIndex({"title":1,"description":-1},{background:true})
    ----创建多个字段索引title升序和description降序background:true让创建工作在后台执行
  db.col.createIndex({"createDate": 1},{expireAfterSeconds: 180})
    ----设置在创建记录后,180秒左右删除。
  注:createDate必须是 Date 类型的单字段索引。180秒后不是立即执行,默认 60s 扫描一次,删除也不一定是立即删除成功。
  1、查看集合索引
    db.col.getIndexes()
  2、查看集合索引大小
    db.col.totalIndexSize()
  3、删除集合所有索引
    db.col.dropIndexes()
  4、删除集合指定索引
    db.col.dropIndex("索引名称")
-----聚合统计----
示例:多层查询(多个管道使用)
  db.getCollection('m_msg_tb').aggregate([
    {$match:{m_id:10001,mark_time:{$gt:new Date(2017,8,0)}}},
    {$group: {
      id: {$dayOfMonth:'$mark_time'},
      pv: {$sum: 1}
      }
    },
    {$sort: {"_id": 1}}
  ])
-----附管理命令----
  $project:修改输入文档的结构。可以用来重命名、增加或删除域,也可以用于创建计算结果以及嵌套文档。
  $match:用于过滤数据,只输出符合条件的文档。$match使用MongoDB的标准查询操作。
  $limit:用来限制MongoDB聚合管道返回的文档数。
  $skip:在聚合管道中跳过指定数量的文档,并返回余下的文档。
  $unwind:将文档中的某一个数组类型字段拆分成多条,每条包含数组中的一个值。
  $group:将集合中的文档分组,可用于统计结果。
  $sort:将输入文档排序后输出。
  $geoNear:输出接近某一地理位置的有序文档。
-----附聚合命令----
  $sum 计算总和。
  $avg 计算平均值
  $min 获取集合中所有文档对应值得最小值。
  $max 获取集合中所有文档对应值得最大值。
  $push 在结果文档中插入值到一个数组中。
  $addToSet 在结果文档中插入值到一个数组中,但不创建副本。
  $first 根据资源文档的排序获取第一个文档数据。
  $last 根据资源文档的排序获取最后一个文档数据
-----格式----
  db.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$sum : "$likes"}}}])
    ----结果中_id是$by_user的分组条件,num_tutorial是统计$likes的和

-------------运维----
-----MongoDB副本集-----
  注:副本集在主机宕机后,副本会接管主节点成为主节点,不会出现宕机的情况。
  mongod --port 27017 --dbpath "D:\set up\mongodb\data" --replSet rs0
    ----启动一个名为rs0的MongoDB实例,其端口号为27017
    db.isMaster() 当前运行的Mongo服务是否为主节点
    rs.initiate() 启动一个新的副本集
    rs.conf() 来查看副本集的配置
    rs.status() 查看副本集状态
    rs.add("mongod1.net:27017") 将一个名为mongod1.net,端口号为27017的Mongo服务添加到副本集中
-----备份和恢复------
  mongodump -h localhost:27017 -d kaiye -o C://mongodump
    -h:MongDB所在服务器地址127.0.0.1:27017
    -d:需要备份的数据库实例kaiye
    -o:备份的数据存放位置C:\mongodump
  mongorestore -h 127.0.0.1:27017 -d test c:\data\dump
    ---恢复c:\data\dump数据到127.0.0.1:27017中的test
-----监控命令----
  .>mongostat 间隔固定时间获取mongodb的当前运行状态
  .>mongotop 默认每秒查看花费大量的时间在读取和写入数据
    ---mongotop 10 每10秒查看
    ---mongotop --locks 查看数据库中锁的状态

-----账号管理----

1.创建管理员
  .>use admin
2.然后创建用户和密码:
  .>db.createUser({user:’root’,pwd:’root1234’,roles:[‘root’]})
3.创建了管理员账号和密码之后,然后运行Mongo服务的时候加上 –auth参数:
  .>mongod --dbpath "F:\db" --logpath "F:\DB.log" --auth
3.创建了管理员账号和密码之后,然后运行Mongo服务的时候加上 –auth参数:
  .>mongod --dbpath "F:\db" --logpath "F:\DB.log" --auth
4.登录数据库
  .>db.auth('root','root1234')
5.node中的应用示例
  mongoose.connect('mongodb://root:root1234@localhost:27017/test?authSource=admin');

posted on 2019-07-05 16:08  xcc_20190625  阅读(153)  评论(0)    收藏  举报

导航