• MongoDB基本操作命令一


    命令行下运行 MongoDB 服务器(启动数据库)

    为了从命令提示符下运行 MongoDB 服务器,你必须从 MongoDB 目录的 bin 目录中执行 mongod.exe 文件。

    D:mongodbinmongod --dbpath c:mongoDBdatadb

    连接MongoDB

    在命令窗口中运行 mongo.exe 命令即可连接上 MongoDB,执行如下命令:

    D:mongodbinmongo.exe

    将MongoDB服务器作为Windows服务运行

    像上面那样启动mongodb,发现没办法输入命令行了,这是可以采用打开多个窗口来连接,但这样就太麻烦了,解决办法就是将MongoDB服务器作为Windows服务运行。

    D:mongoDBinmongod.exe --config "D:mongodbinmongod.cfg" --install

    启动MongoDB服务:
    net start MongoDB    (启动之后在 服务中可看到状态为正在运行)
    关闭MongoDB服务:       net stop MongoDB
    移除MongoDB服务:       D:mongoDBinmongod.exe --remove

    由于我们并没有指定mongodb服务的端口号,所以它启动在默认的27017窗口。

       打开浏览器,范围地址http://127.0.0.1:27017/,可看到如下信息:

       It looks like you are trying to access MongoDB over HTTP on the native driver port.

    MongoDB 后台管理 Shell

      如果你需要进入MongoDB后台管理,你需要先打开mongodb安装目录的下的bin目录,然后执行mongo.exe文件,

       MongoDB Shell是  MongoDB自带的交互式Javascript shell,用来对MongoDB进行操作和管理的交互式环境。

    然后可以执行一些操作:

      第一个命令将数字 10 插入到 runoob 集合的 x 字段中:
    db.runoob.insert({x:10})
      查找:db.runoob.find().pretty()  //输出格式美化
    MongoDB的一些命令:

      
      显示所有数据库列表: show dbs

       显示当前数据库对象或集合: db

        如果数据库不存在,则创建数据库,否则切换到指定数据库 : use database_name

    删除数据库的语法:
    db.dropDatabase() 删除当前数据库,默认为 test,你可以使用 db 命令查看当前数据库名
          查看已有集合:  show tables/collections    
      
         创建集合: db.createCollection(name, options)

         创建带参数的固定集合:(整个集合空间大小 6142800 B, 文档最大个数为 10000 个)

               db.createCollection('
    collectionName',{capped: true,autoIndexId: true,size:6142800,max: 10000})
      
         集合删除语法格式如下: db.collectionName.drop()

        
    在 MongoDB 中,你不需要创建集合。当你插入一些文档时,MongoDB 会自动创建集合:
              
               db.mycols.insert({'name' : '测试插入时自动创建集合'})


         插入文档:
                 db.collectionName.insert(document)  
               或
            db.
    collectionName.save(document)

         save():如果 _id 主键存在则更新数据,如果不存在就插入数据。该方法新版本中已废弃,可以使用 db.collection.insertOne() 或 db.collection.replaceOne() 来代替。

           insert(): 若插入的数据主键已经存在,则会抛 org.springframework.dao.DuplicateKeyException 异常,提示主键重复,不保存当前数据。


         db.
    collectionName.insertOne(): 向指定集合中插入一条文档数据
         db.collectionName.insertMany(): 向指定集合中插入多条文档数据

       MongoDB 使用 update() 和 save() 方法来更新集合中的文档:

        update() 方法: 用于更新已存在的文档

          db.collectionName.update(
            <query>,                  //update的查询条件
            <update>,                 //update的对象和一些更新的操作符等
            {
              upsert: <boolean>,         //可选参数,如果不存在 update的记录,是否插入,默认是false,不插入
              multi: <boolean>,         // 可选参数,默认false,只更新找到的第一条记录,若为 true,把按条件查出来的多条记录全部更新
              writeConcern: <document>     // 可选,抛出异常的级别
            }
          )
          例子:
    db.col.update({'title':'MongoDB 教程'},{$set:{'title':'MongoDB'}},{multi:true})
       save()方法: save() 方法通过传入的文档来替换已有文档,_id 主键存在就更新,不存在就插入
          
          db.collectionName.save(
            <document>,            //文档数据
            {
              witeConcern: <document>  // 可选参数,抛出异常的级别
            }
          )

      
      remove() 删除文档(移除集合中的数据):
      
        db.collectionName.remove(
          <query>,              // 可选,删除的文档的条件
          {
            justOne : <boolean>,     // 可选,如果设为 true 或 1,则只删除一个文档,如果不设置该参数,或使用默认值 false, 则删除所有匹配条件的文档。
            writeConcern: <document>   // 可选,抛出异常的级别
          }
        )

        注意: 只想删除第一条找到的记录可以设置 justOne 为 1
            想删除所有数据, 使用
    justOne 默认值 为false
        删除集合下的所有数据: db.collectionName.remove({})


     remove() 方法已经过时了,现在官方推荐使用 deleteOne() 和 deleteMany() 方法。

        如删除集合下全部文档:               db.collectionName.deleteMany({})

        删除 status 等于 A 的全部文档:  db.collectionName.deleteMany({ status : "A" })

        删除 status 等于 D 的一个文档:  db.collectionName.deleteOne( { status: "D" } ) 

        查询文档: 主要使用 find()方法,以非结构化的方式来显示所有文档。

           db.collectionName.find(query,projection); // query 可选参数,使用查询操作符查询条件 projection 可选,使用投影操作符指定返回的键。查询时返回文档中所有键值,只需省略该参数即可(默认省略)。
          
          需要以易读的方式来读取数据,可以使用 pretty() 方法: db.collectionName.find().pretty()

          findOne() 方法,只返回一个文档。

     条件语句查询:(
    条件操作符)
          db.col.find({"num":50}).pretty()          // num = 50 
          db.col.find({"num":{$lt:50}}).pretty()       // num < 50
          db.col.find({"num":{$lte:50}}).pretty()      // num <= 50
          db.col.find({"num":{$gt:50}}).pretty()      // num > 50
          db.col.find({"num":{$gt:50}}).pretty()      // num > 50
          db.col.find({"num":{$gte:50}}).pretty()      // num >= 50
          db.col.find({"num":{$ne:50}}).pretty()      // num != 50
          db.col.find({"num":{$lt:200,$gt:100}})      // 100 < num < 200
     MongoDB and 条件:
          
          db.col.find({key1:value, key2:value2}).pretty()

     MongoDB or 条件:

          db.col.find(
            {
              $or : [
                {key1 : value1}, {key2 : value2}
              ]
            }  
          ).pretty()

     MongoDB and 和 or 联合使用:  类似 SQL where key1 > value1 and (key2 = value2 or key3 = value3)
         db.col.find({key1 : {$gt : value1}, $or[{key2 : value2}, {key3 : value3}]).pretty()

     MongoDB $type 条件操作符:( $type 操作符是基于 BSON 类型来检索集合中匹配的数据类型,并返回结果。)
        例如,想过去 col 集合中 title 为 String 的数据: (2 代表字符串类型 strig)   参考 :MongoDB $type 操作符 | 菜鸟教程
        db.col.find({"title" : {$type : 2}}) 或者
    db.col.find({"title" : {$type : "string"}})
    MongoDB Limit 于 Skip 方法:
        
        Limit() 方法: 如果你需要在 MongoDB 中读取指定数量的数据记录,可以使用 MongoDB 的 Limit 方法,limit() 方法接受一个数字参数,该参数指定从 MongoDB 中读取的记录条数

          db.collectionName.find().limit(number)

        Skip() 方法: 使用 skip() 方法来跳过指定数量的数据,skip 方法同样接受一个数字参数作为跳过的记录条数

          db.collectionName.find().limit(1).skip(1) //限制显示一条,然后跳过第一条,显示第二条

          db.collectionName.find().skip(1)       //跳过第一条,显示后面的数据

    MongoDB 排序:
          
          sort() 方法: 可以通过参数指定排序的字段,并使用 1 和 -1 来指定排序的方式,其中 1 为升序排列,而 -1 是用于降序排列。

          db.collectionName.find().sort({key:1}) 例子: db.collectionName.find({}, {"title": 1,"_id":0}).sort({"likes": -1})

    skip(), limilt(), sort()三个放在一起执行的时候,执行的顺序是先 sort(), 然后是 skip(),最后是显示的 limit()。

      
    MongoDB 索引:(每个索引占据一定的存储空间,在进行插入,更新和删除操作时也需要对索引进行操作。所以,如果你很少对集合进行读取操作,建议不使用索引。)

         (
    由于索引是存储在内存(RAM)中,你应该确保该索引的大小不超过内存的限制。如果索引的大小大于内存的限制,MongoDB会删除一些索引,这将导致性能下降

          最大范围:
            1.
    集合中索引不能超过64个。
           2.
    索引名的长度不能超过125个字符
           3.
    一个复合索引最多可以有31个字段
          索引是特殊的数据结构,索引存储在一个易于遍历读取的数据集合中,索引是对数据库表中一列或多列的值进行排序的一种结构

         createIndex()
    方法来创建索引:

          db.collectionName.createIndex(keys, options); // Key 值为你要创建的索引字段,1 为指定按升序创建索引,如果你想按降序来创建索引指定为 -1 即可

          如: db.col.createIndex({"title" : 1})

         createIndex() 方法中你也可以设置使用多个字段创建索引(关系型数据库中称作复合索引)。

          如: db.col.createIndex({"title" : 1, "description": -1})
          
         在后台创建索引 : db.values.createIndex({open : 1, close : 1}, {background : true})

         查看集合索引:  db.collectionName.getIndexes()
        
         查看集合索引大小:db.collectionName.totalIndexSize()
        
         删除集合所有索引:db.collectionName.dropIndexes()

         删除集合指定索引:db.collectionName.dropIndex("索引名称")

        注意在 3.0.0 版本前创建索引方法为 db.collection.ensureIndex(),之后的版本使用了 db.collection.createIndex() 方法,ensureIndex() 还能用,但只是 createIndex() 的别名。

    MongoDB 聚合:(MongoDB 中聚合(aggregate)主要用于处理数据(诸如统计平均值,求和等),并返回计算后的数据结果)
              aggregate() MongoDB中的聚合方法。
        
             db.collectionName.aggregate(AGGREATE_OPERATION)
        
             例子: db.col.aggregate([{$group : {_id : "$by_user", num_tutorial : {$sum:1}}}])       //通过字段 by 对数据进行分组,并计算 by 字段相同值的总和
                 db.col.aggregate([{$group : {_id : "$by_user", num_tutorial : {$avg : "$likes"}}}])    //计算平均值

                 db.col.aggregate([{$group : {_id : "$by_user", num_tutorial : {$min : "$likes"}}}])  //获取集合文档对应值得最小值
                 db.col.aggregate([{$group : {_id : "$by_user", num_tutorial : {$max : "$likes"}}}])  //获取集合文档对应值得最大值             

                 db.col.aggregate([{$group : {_id : "$by_user", url : {$push : "$url"}}}])        //在结果文档中插入值到一个数组中
                 db.col.aggregate([{$group : {_id : "$by_user", url : {$addToSet : "$url"}}}])      //在结果文档中插入值到一个数组中,但不创建副本

                 db.col.aggregate([{$group : {_id : "$by_user", first_url : {$first : "$url"}}}])    //根据资源文档的排序获取第一个文档数据

                 db.col.aggregate([{$group : {_id : "$by_user", last_url : {$last : "$url"}}}])     //根据资源文档的排序获取最后一个文档数据

      管道: MongoDB 的聚合管道将 MongoDB 文档在一个管道处理完毕后将结果传递给下一个管道处理

      聚合框架中常用的几个操作:

          $project: 修改输入文档的结构。可以用来重命名、增加或删除域,也可以用于创建计算结果以及嵌套文档。

          $match: 用于过滤数据,只输出符合条件的文档。$match使用MongoDB的标准查询操作。

          $limit:     用来限制MongoDB聚合管道返回的文档数。

          $skip:     在聚合管道中跳过指定数量的文档,并返回余下的文档。

          $unwind:将文档中的某一个数组类型字段拆分成多条,每条包含数组中的一个值。

          $group:  将集合中的文档分组,可用于统计结果。

          $sort:     将输入文档排序后输出。

          $geoNear:输出接近某一地理位置的有序文档。

    MapReduce 命令:( Map-Reduce 是一种计算模型,简单的说就是将大批量的工作(数据)分解(MAP)执行,然后再将结果合并成最终结果(REDUCE))
          
          MongoDB提供的 Map-Reduce 非常灵活,对于大规模数据分析也相当实用

          db.col.mapReduce(
            function(){ emit(key, value)}              // map 函数 (映射函数 (生成键值对序列,作为 reduce 函数参数)。)
            function(key,values){ return reduceFunction }    // reduce 函数 (reduce 统计函数,reduce函数的任务就是将 key-values 变成 key-value ,也就是把 values 数组变成一个单一的值 value )
            {
              out : collection,                   // out 统计结果存放集合 (不指定则使用临时集合,在客户端断开后自动删除)
              query : document,                   // query 一个筛选条件,只有满足条件的文档才会调用 map 函数。(query。limit,sort可以随意组合)
              sort : document,                   // sort 和 limit 结合的 sort 排序参数(也是在发往 map 函数前给文档排序),可以优化分组机制
              limit : number                    // limit 发往 map 函数的文档数量的上限(要是没有limit,单独使用sort的用处不大)
            }
          )

         // 使用 MapReduce 要实现两个函数 Map 函数和 Reduce 函数,Map 函数调用 emit(key, value), 遍历 collection 中所有的记录, 将 key 与 value 传递给 Reduce 函数进行处理
          // Map 函数必须调用 emit(key, value) 返回键值对

    MongoDB 复制 (副本集): ( MongoDB 复制是将数据同步在多个服务器的过程,复制还允许您从硬件故障和服务中断中恢复数据)


    MongoDB 分片 : 另一种集群,就是分片技术,可以满足 MongoDB 数据量大量增长的需求。
             当 MongoDB 存储海量的数据时,一台机器可能不足以存储数据,也可能不足以提供可接受的读写吞吐量。这时,我们就可以通过在多台机器上分割数据,使得数据库系统能存储和处理更多的数据
          
            分片实列
            分片结构端口分布:

            Shard Server 1: 27020
            Shard Server 2: 27021
            Shard Server 3: 27022
            Shard Server 1: 27023
            Config Server 4: 27100
            Route Process 1: 40000
         步骤一:启动 Shard Server
            1. 在 D盘文件下创建目录 ( -p 参数表示创建子目录 )
      
              mkdir -p /www/mongoDB/shard/s0
              mkdir -p /www/mongoDB/shard/s1
              mkdir -p /www/mongoDB/shard/s2
              mkdir -p /www/mongoDB/shard/s3
              
              然后命令行执行 :进入到 mongodb 安装目录: cd: D:mongoDBin 执行命令:

              mongod --port 27020 --dbpath=D:mongoDBdatashards0 --logpath=D:mongoDBdatashardlogs0.log --logappend
              mongod --port 27021 --dbpath=D:mongoDBdatashards1 --logpath=D:mongoDBdatashardlogs1.log --logappend
              mongod --port 27022 --dbpath=D:mongoDBdatashards2 --logpath=D:mongoDBdatashardlogs2.log --logappend
              mongod --port 27023 --dbpath=D:mongoDBdatashards3 --logpath=D:mongoDBdatashardlogs3.log --logappend
        
              步骤二:启动 config Server
              mkdir -p /www/mongoDB/shard/config
              mongod --port 27100 --dbpath=D:mongoDBdatashardconfig --logpath=D:mongoDBdatashardlogconfig.log --logappend
     
              步骤三:启动 Route Process
              
              mongos --port 40000 --configdb localhost:27100 --fork --logpath=
    D:mongoDBdatashardlog oute.log --chunkSize 500

              ( mongos 启动参数中,chunkSize 这一项是用来指定 chunk 的大小的,单位是MB,默认大小为200MB.)

              步骤三出现的问题
              
              
              原因:
                  使用的 MongoDB 3.4.10 版,这个版本在之前的版本上有做调整,要求configs服务器是副本集模式。3.2和3.2以下都不做强制要求的。
              
              解决方法:

                1.configs服务器配置成副本集模式

                2.把MongoDB换成3.4以下版本

              步骤四:配置 Sharding

              
    使用 MongoDB Shell 登录到 mongos,添加 Shard 节点。
              mongo admin --port 40000
              db.runCommand({ addshard:"localhost:27020" })
              db.runCommand({ addshard:"localhost:27021" })
              db.runCommand({ addshard:"localhost:27022" })
              db.runCommand({ addshard:"localhost:270203" })
              db.runCommand({ enablesharding:"test" })      //设置分片存储的数据库
              db.runCommand({ shardcollection: "test.log", key: { id:1,time:1}})

              步骤五:
              程序代码内无需太大更改,直接按照连接普通的mongo数据库那样,将数据库连接接入接口40000


     
     
     
     
     


              
     














  • 相关阅读:
    Java基础回顾---JVM&JDK&JRE
    学习
    学习
    学习
    进度
    进度
    毕设进度
    学习进度
    Beta阶段项目总结
    第二阶段冲刺——seven
  • 原文地址:https://www.cnblogs.com/liaolei1/p/15039802.html
Copyright © 2020-2023  润新知