• 笔记:MongoDB 基础学习


    一、MongoDB 要点

    1.MongoDB 特性:
    1.模式自由,支持动态查询、完全索引
    2.面向文档存储,易存储对象类型数据
    3.高效的数据存储
    4.支持复制和故障恢复,提供主从、主主模式的数据复制,服务器之间的复制
    5.自动分片,支持云级别的伸缩性,支持水平的数据库集群,可动态添加额外的服务器
     
    2.MongoDB 工作方式:
    1.介于关系数据库与非关系数据库之间
    2.由database、collection、document三个层次
    3.以单文档为单位存储
    4.BSON (Binary SerializedDocument Notation)
    5.使用了内存映射文件进行数据管理,把所有空闲内存当做缓存使用,且不能指定内存大小。优点:可以最大限度提升性能;缺点:容易受其他程序干扰。
    6.数据空间采用预分配,避免形成过多硬盘碎片。为每一个数据库分配一系列文件,每个数据库会被分配一个大小,第一个文件名字为“.0”,大小为64M,第二个为“.1”,大小为128M,以此类推
    7.“_id”字段为主键,自动生成ObjectId对象
    8.每次插入BSON对象大小不超过4MB,超过4MB使用GridFS
    9.删除记录不真正删除,只标记“已删除”,故删除不释放空间

    3.MongoDB 主从服务启动
    ./mongod --master--port=11017 --dbpath=/data/db1 &
    ./mongod --slave--source=10.1.2.11:11017 --port=11018 --dbpath=/data/db2--slavedelay 5 &

    从服务器只可读,不可写

    4.MongoDB 分片
    见书本,待补充


    二、Java接口操作 
     
    1.连接集群
    MongoClient mongoClient = new MongoClient(Arrays.asList(new ServerAddress("10.1.2.11", 27017),
                                          new ServerAddress("10.1.2.12",27018),newServerAddress("10.1.2.12",27019)));
    
    2.查找数据库
    DB db = m.getDB( "mydb" );
    
    3.验证用户名密码
    boolean auth = db.authenticate(myUserName, myPassword);
    
    4.查找集合
    DBCollection bookCollection= db.getCollection("book");
    
    5.插入
    BasicDBObject doc =newBasicDBObject("name", "MongoDB").append("type", "database").append("count", 1).append("info", newBasicDBObject("x", 203).append("y", 102));

    bookCollection.insert(doc);

    6.查找
    BasicDBObject query = new BasicDBObject("j", new BasicDBObject("$ne", 3).
                                          append("k", new BasicDBObject("$gt", 10));Cursor cursor=coll.find(query);try{
      while(cursor.hasNext())    { 
           System.out.println(cursor.next());   } } finally{ 
        cursor.close(); 
    }
    
    7.索引
    coll.createIndex(new BasicDBObject("i", 1));  // create index on "i", ascending
    
    
     
    8.异常级别参数
    转载自:http://blog.csdn.net/xinghebuluo/article/details/7035123
    • WriteConcern.NONE:没有异常抛出
    • WriteConcern.NORMAL:仅抛出网络错误异常,没有服务器错误异常
    • WriteConcern.SAFE:抛出网络错误异常、服务器错误异常;并等待服务器完成写操作。
    • WriteConcern.MAJORITY: 抛出网络错误异常、服务器错误异常;并等待一个主服务器完成写操作。
    • WriteConcern.FSYNC_SAFE:抛出网络错误异常、服务器错误异常;写操作等待服务器将数据刷新到磁盘。
    • WriteConcern.JOURNAL_SAFE:抛出网络错误异常、服务器错误异常;写操作等待服务器提交到磁盘的日志文件。
    • WriteConcern.REPLICAS_SAFE:抛出网络错误异常、服务器错误异常;等待至少2台服务器完成写操作。

     当我们执行如下操作时(将"name"为"lily"的"age"设置为20):

    db.update({"name":"lily"},{"$set":{"age":20}})
    

    默认情况下,该操作会使用WriteConcern.NORMAL(仅在网络错误时抛出异常),等同于:

    db.update({"name":"lily"},{"$set":{"age":20}},WriteConcern.NORMAL)
    

    使用NORMAL模式参数,可以使得写操作效率非常高。但是如果此时服务器出错,也不会返回错误给客户端,而客户端会误认为操作成功。

    因此在很多重要写操作中需要使用WriteConcern.SAFE模式,保证可以感知到这个错误,保证客户端和服务器对一次操作的正确性认知保持一致。


    9.集群读操作

    ReadPreference.primary();
    
    
    ReadPreference.primaryPreferred();
    
    
    ReadPreference.secondary();
    
    ReadPreference.secondaryPreferred();
    
    ReadPreference.nearest();
    
    • PRIMARY

      The default read mode. Read from primary only. Throw an error ifprimary is unavailable. Cannot be combined with tags.

    • PRIMARY PREFERRED

      Read from primary if available, otherwise a secondary.

    • SECONDARY

      Read from a secondary node if available, otherwise error.

    • SECONDARY PREFERRED

      Read from a secondary if available, otherwise read from theprimary.

    • NEAREST

      Read from any member node from the set of nodes which respond thefastest. The responsiveness of a node is measured with pings. Anynode whose ping time is within 15 milliseconds of the node with thelowest ping time is considered near


    三、数据操作

    1.插入 insert
    2.查找 query

    db.user.find({'userid':11},{'name':1,'address':1})
    前一个BSON表示查询条件,后一个BSON表示返回的列
      
    大小比较 $gt, $lt, $gte, $lte,$ne
    db.user.find({'_id':{'$gt':100,'lte':1000}})

    数组元素范围,$all 全有
    db.user.find({a:{$all:[1,2,3]}})
    $in, 有一个
    db.user.find({a:{$in:[1,2,3]}})
    $nin, 没有
    db.user.find({a:{$nin:[1,2,3]}})

    存在某字段 $exists
    db.user.find({"email":{$exists:true}})

    或者$or
    db.user.find({$or:[{'name':'haha'},{'id':555},{'grade':'100'}]})

    全非 $nor
    db.user.find({$nor:[{'name':'haha'},{'id':555},{'grade':'100'}]})

    数组长度 $size
    db.user.find({a:{$size:5}})

    $where, 用于编写较复杂的自定义函数

    $type , BSON类型

    正则表达式
    db.user.find({'name':${$regex:'u.*4$',$options:'i'}})

    数目限制limit, 跳过skip
    db.user.find.skip(5).limit(100)

    排序 sort
    db.user.find.sort({name:1,grade:-1});

    分组group
    db.user.group({
    cond:{"country":"cn"},
    key:{'city':true},
    initial:{count:0,total_time:0},
    reduce: function(doc,out){
     out.count++;
      out.total_time += doc.total_time;
     },
    finalize:function(out) {
       out.avg_time= out.total_time/ out.count;
      }
    })

    记录条数 count

    唯一distinct

    嵌套成员匹配 $elemMatch

    执行计划 explain

    游标 
    var cursor =db.user.find()

    建立索引 ensureIndex
    db.user.ensureIndex({name:1,grade:-1})

    返回的记录数目范围 $slice
    db.posts.find({},{comments:{$slice: 5}}) // 前5条评论 
    db.posts.find({},{comments:{$slice: -5}}) //后5条评论 
    db.posts.find({},{comments:{$slice: [20, 10]}}) // skip 20, limit10 
    db.posts.find({},{comments:{$slice: [-20, 10]}}) // 20 from end, limit10


    3.更新 update

    db.user.update({"name":"tom"},{$set:{'grade':100}},true,true)
    参数1:查询条件
    参数2:设置更新内容
    参数3:是否若存在则更新,不存在新建
    参数4:是否更新多条记录

    $inc 数字增加
    db.user.update({_id:1},{$inc:{age:1}})

    $set 设置属性内容
    $unset 删除属性
    db.user.update({_id:1},{$unset:{email:1}})


    $push 往数组添元素
    $push 往数组添子数组

    $pop删除数组第一个元素
    $pull 删除数组元素
    $pullAll删除数组 

    $rename 重命名属性
    db.user.update({_id:2},{$rename:{'aihao':'hobby'}})

    $第一个匹配到的元素
    db.user.update({x: 2}, {$inc: {"x.$":1}}, false, true);

    4. save --存在则更新,不存在则创建
    db.user.save({'_id':111,'name':'tom'})
    和insert区别:insert若存在则抛异常
    和update区别:参数个数不一样

    5.添加用户
    useadmin 
    db.addUser("theadmin","anadminpassword",false)
    第三个表示是否只读

    6.用户认证
    db.auth("theadmin","anadminpassword") 

  • 相关阅读:
    Day1:T1 模拟 T2 拓扑排序
    vijos1060 隔板法
    字符串处理:kmp算法
    vijos1004 博弈论
    vijos1009:扩展欧几里得算法
    有关浮点数的精度问题
    C++构造 下一个排列 的函数
    vijos1053 用spfa判断是否存在负环
    SPFA和FLOYD算法如何打印路径
    细节MARK
  • 原文地址:https://www.cnblogs.com/leeeee/p/7276600.html
Copyright © 2020-2023  润新知