zoukankan      html  css  js  c++  java
  • MongoDB 基本语法笔记

    MongoDB常识

    MongoDB Shell是MongoDB自带的交互式Javascript shell,所以可直接执行JS脚本,用来对MongoDB进行操作和管理的交互式环境。


    ObjectId:

    MongoDB采用ObjectId,而不是其他比较常规的做法(比如自动增加的主键)的主要原因,因为在多个 服务器上同步自动增加主键值既费力还费时。

    系统保留数据库名称

    admin: 从权限的角度来看,这是"root"数据库。要是将一个用户添加到这个数据库,这个用户自动继承所有数据库的权限。一些特定的服务器端命令也只能从这个数据库运行,比如列出所有的数据库或者关闭服务器。
    local: 这个数据永远不会被复制,可以用来存储限于本地单台服务器的任意集合
    config: 当Mongo用于分片设置时,config数据库在内部使用,用于保存分片的相关信息。

    文档字段类型: 

    MongoDB 的文档不需要设置相同的字段,并且相同的字段不需要相同的数据类型,这与关系型数据库有很大的区别,也是 MongoDB 非常突出的特点。

    如: 

    db.reply.insert({name:"美丽",age:10});
    db.reply.insert({name:"美丽",age:'50岁了',sex:0})

    capped collections

    MongoDB 固定集合(Capped Collections)是性能出色且有着固定大小的集合,对于大小固定,我们可以想象其就像一个环形队列,当集合空间用完后,再插入的元素就会覆盖最初始的头部的元素!

    • 可以插入及更新,但更新不能超出collection的大小,否则更新失败.
    • 它有很高的性能以及队列过期的特性(过期按照插入的顺序)
    • 文档在磁盘上存放位置也是按照插入顺序来保存的.
    • 使用 Capped Collection 不能删除一个文档,可以使用 drop() 方法删除 collection 所有的行。
    • 删除之后,你必须显式的重新创建这个 collection。

    用法:

    • 用法1:储存日志信息
    • 用法2:缓存一些少量的文档

    MongoDB  URI 协议:  

    mongodb://[username:password@]host1[:port1][,host2[:port2],...[,hostN[:portN]]][/[database][?options]]



    update() 方法

    update() 方法用于更新已存在的文档。语法格式如下:

    db.collection.update(
       <query>,
       <update>,
       {
         upsert: <boolean>,
         multi: <boolean>,
         writeConcern: <document>
       }
    )

    参数说明:

    • query : update的查询条件,类似sql update查询内where后面的。
    • update : update的对象和一些更新的操作符(如$,$inc...)等,也可以理解为sql update查询内set后面的
    • upsert : 可选,这个参数的意思是,如果不存在update的记录,是否插入objNew,true为插入,默认是false,不插入。
    • multi : 可选,mongodb 默认是false,只更新找到的第一条记录,如果这个参数为true,就把按条件查出来多条记录全部更新
    • writeConcern :可选,抛出异常的级别。

    例子:
    //更新title=ddddddddddd的所有记录, title被更新为2323
    db.col.update({title:"ddddddddddd"}, {$set:{title:"2323"}},{multi:true});
    更多实例:

    //只更新第一条记录:
    db.col.update( { "count" : { $gt : 1 } } , { $set : { "test2" : "OK"} } );
    
    //全部更新:
    db.col.update( { "count" : { $gt : 3 } } , { $set : { "test2" : "OK"} },false,true );
    
    //只添加第一条:
    db.col.update( { "count" : { $gt : 4 } } , { $set : { "test5" : "OK"} },true,false );
    
    //全部添加进去:
    db.col.update( { "count" : { $gt : 5 } } , { $set : { "test5" : "OK"} },true,true );
    
    //全部更新:
    db.col.update( { "count" : { $gt : 15 } } , { $inc : { "count" : 1} },false,true );
    
    //只更新第一条记录:
    db.col.update( { "count" : { $gt : 10 } } , { $inc : { "count" : 1} },false,false );

    
    

    save() 方法

    save() 方法通过传入的文档来替换已有文档。语法格式如下:

    db.collection.save(
       <document>,
       {
         writeConcern: <document>
       }
    )

    参数说明:

    • document : 文档数据。
    • writeConcern :可选,抛出异常的级别。

     备注:

    如果集合内部已经存在一个和document 相同的 "_id" 的记录,Mongodb会把document对象替换集合内已存在的记录,如果不存在,则会插入document对象。

      


    find()方法

    AND

    db.col.find({key1:value1, key2:value2}).pretty()

    OR

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

     demo:

    //混合AND ,Or查询
    db.col.find({
        title:"2323",
        $or:[{by:"菜鸟教程"},{name:"name1"}]
        })

    使用正则表达式

    db.posts.find({post_text:{$regex:"runoob"}})

    或者:
    db.posts.find({post_text:/runoob/})

    其他:

    //正则匹配
    //查询 title 包含"教"字的文档:
    db.col.find({title:/教/})
    
    //查询 title 字段以"教"字开头的文档:
    db.col.find({title:/^教/})
    
    //查询 titl e字段以"教"字结尾的文档:
    db.col.find({title:/教$/})
    
    //$type操作符
    db.col.find({"title" : {$type : 2}})
    //
    db.col.find({"title" : {$type : 'string'}})
    
    
    //Limit() 方法
    //db.COLLECTION_NAME.find().limit(NUMBER)
    
    
    //Skip() 方法
    //db.COLLECTION_NAME.find().limit(NUMBER).skip(NUMBER)
    
    
    //排序,1:升序, -1:降序
    //db.COLLECTION_NAME.find().sort({KEY:1})
    db.col.find().sort({likes:-1})

    索引:

    创建索引:

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

    //demo: 创建索引 
    db.values.createIndex({open: 1, close: 1}, {background: true})
    
    //1、查看集合索引
    db.col.getIndexes()
    
    //2、查看集合索引大小
    db.col.totalIndexSize()
    
    //3、删除集合所有索引
    db.col.dropIndexes()
    
    //4、删除集合指定索引
    db.col.dropIndex("索引名称")

    高级索引:

    考虑以下文档集合(users ):

    {
       "address": {
          "city": "Los Angeles",
          "state": "California",
          "pincode": "123"
       },
       "tags": [
          "music",
          "cricket",
          "blogs"
       ],
       "name": "Tom Benzamin"
    }

    1) 索引数组字段:

    db.users.ensureIndex({"tags":1})

     该索引支持如下查询:

    db.users.find({tags:"cricket"})

    2)索引子文档字段

    db.users.ensureIndex({"address.city":1,"address.state":1,"address.pincode":1})

    该索引支持如下查询;

    db.users.find({"address.city":"Los Angeles","address.state":"California","address.pincode":"123"})

      

    原子操作常用命令

    //$set
    //用来指定一个键并更新键值,若键不存在并创建。
    { $set : { field : value } }
    
    //$unset
    //用来删除一个键。
    { $unset : { field : 1} }
    
    //$inc
    //$inc可以对文档的某个值为数字型(只能为满足要求的数字)的键进行增减的操作。
    { $inc : { field : value } }
    
    //$push
    { $push : { field : value } }
    //把value追加到field里面去,field一定要是数组类型才行,如果field不存在,会新增一个数组类型加进去。
    
    //$pushAll 同$push,只是一次可以追加多个值到一个数组字段内。
    { $pushAll : { field : value_array } }
    
    //$pull
    //从数组field内删除一个等于value值。
    { $pull : { field : _value } }
    
    //$addToSet
    //增加一个值到数组内,而且只有当这个值不在数组内才增加。
    
    //$pop
    //删除数组的第一个或最后一个元素
    { $pop : { field : 1 } }
    
    //$rename
    //修改字段名称
    { $rename : { old_field_name : new_field_name } }
    
    //$bit
    //位操作,integer类型
    {$bit : { field : {and : 5}}}
    
    //偏移操作符
    > t.find() { "_id" : ObjectId("4b97e62bf1d8c7152c9ccb74"), "title" : "ABC", "comments" : [ { "by" : "joe", "votes" : 3 }, { "by" : "jane", "votes" : 7 } ] }
     
    > t.update( {'comments.by':'joe'}, {$inc:{'comments.$.votes':1}}, false, true )
     
    > t.find() { "_id" : ObjectId("4b97e62bf1d8c7152c9ccb74"), "title" : "ABC", "comments" : [ { "by" : "joe", "votes" : 4 }, { "by" : "jane", "votes" : 7 } ] }

     索引限制

    由于索引是存储在内存(RAM)中,你应该确保该索引的大小不超过内存的限制。

    如果索引的大小大于内存的限制,MongoDB会删除一些索引,这将导致性能下降。

    索引不能被以下的查询使用:

    • 正则表达式及非操作符,如 $nin, $not, 等。
    • 算术运算符,如 $mod, 等。
    • $where 子句

    Map Reduce

    以下是MapReduce的基本语法:

    db.collection.mapReduce(
       function() {emit(key,value);},  //map 函数
       function(key,values) {return reduceFunction},   //reduce 函数
       {
          out: collection,
          query: document,
          sort: document,
          limit: number
       }
    )

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

    Map 函数必须调用 emit(key, value) 返回键值对。

    参数说明:

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

     参考引用:

    https://blog.csdn.net/qq_27093465/article/details/81332552

    http://www.runoob.com/mongodb/mongodb-tutorial.html







  • 相关阅读:
    hbase scan超时问题
    hadoop的shuffle和排序
    MapReduce作业的调度
    hadoop hdfs问题集锦
    JVM--双亲委派机制
    springboot快速搭建
    CircleView
    TabHost实现底部导航栏
    GridView的stretchMode属性
    Android直连SQL Server数据库
  • 原文地址:https://www.cnblogs.com/snow-man/p/10150175.html
Copyright © 2011-2022 走看看