mongodb学习笔记系列一

一、简介和安装
    ./bin/mongod --dbpath /path/to/database --logpath /path/to/log --fork --port 27017
    mongodb非常的占磁盘空间, 刚启动后要占3-4G左右,--smallfiles
二、基本命令
    1、登录mongodb client
        /use/local/mongo
    2、查看当前数据库
        show databases;
        show dbs;
        两个可能
    3、admin是和管理有关的库,local 是放schema有关的内容,不要乱动
    4、切换到数据库
        use admin;
        show tables;
        或者
        show collections;
            admin下的表不要随便操作。
    5、db help查看数据库操作帮助命令
    6、创建数据库:mongo是隐式创建
        use shop;
    7、创建表[集合]
        db.createcollection(‘user‘);
    8、show dbs;
    9、查看表[集合]
        show collections
    10、插入数据
        db.user.insert({name:lisi,age:22});
    11、查看数据:db.user.find();
    12、db.user.insert(id:3,name:‘hmm‘,hoby:[‘basketball‘,‘fottball‘],intro:{title:‘my intro‘});
    13、collection也是不用显示创建的
    14、db.goods.insert(_id:1,name:‘n1‘,price:133);
        由此可见不用显示创建collection
    15、删除collection
        db.user.drop();//删除集合user
    16、db.dropDatabase();//删除database;
三、CRUD操作
    1、增加单篇文档
        db.stu.insert({sn:001,name,‘xiaoming‘});
        覆盖默认ID
        db.stu.insert({_id:002,sn:002,name:‘lisi‘});
    2、批量插入
        db.stu.insert({_id:3,sn:003,name:guangyu},{_id:4,sn:004,name:zhangwei});
    3、插入无限制深度的文档
        db.stu.insert({name:x:‘li‘,m:‘shimin‘},{jli:‘xxx‘})
    4、删除
        db.stu.remove({sn:001});
        删除sn为001的文档
    5、删除全部
        db.stu.remove();
    6、查询表达式是json对象
    7、继续删除
        db.stu.remove(gender:‘m‘);
        db.stu.remove(gender:‘m‘,true);
        true限制只能删除一行

    8、错误的修改
        db.stu.update({name:‘zhangsan‘},{name:‘lisi‘});
        前一个表达式为想要修改的操作,后一个表达式表示要改成什么样。这个修改有问题,新文档直接替换旧文档,其他属性都不见了。
    9、正确的修改
        db.stu.update({name:‘poxi‘},{$set:{name:‘yanpoxi‘}});
        $set 修改
        $unset 重设 1-->true 0-->false
        $rename    重命名
        $inc 增长

        db.stu.update(
            {name:‘wukong‘},
            {
             $set:{name:‘douzhanshengfo‘},
             $unset:{jinggu:1},
             $rename:{set:gender},
             $inc:{age:2}
            }
            );

    10、multi 修改多行
            db.stu.update({
            {gender:‘m‘},
            {gender:‘male‘},
            {multi:1}
            })
    multiple表示可修改多行,不加只能修改匹配多行中的一行
    11、upsert $setonInsert
        db.stu.update(
            {name:‘wuyong‘},
            {$set:{name:‘junshiwuyong‘}}
            );
        如果没有wuyong这个人,那么将不做任何修改
        db.stu.update(
            {name:‘wuyong‘},
            {$set:{name:‘junshiwuyong‘}},
            {upsert:true}
            );
        如果添加upsert为true,那么自动插入
        但是这还是有问题,原来的字段会丢失
        这个时候需要upsert的setOnInsert
            db.stu.update(
            {name:‘wuyong‘},
            {$set:{name:‘junshiwuyong‘}},
            {upsert:true},
            {$setOnInsert:{gender:‘male‘}}//加上原来的字段
            );
    12、查询
        查询所有文档所有内容
        db.stu.find();
        查询所有文档的gender属性
        db.stu.find({},{gender:1})
        查询所有文档的gender属性,且不查询_id属性
        db.stu.find({},{gender:1,_id:0})

四:深入查询表达式
        1: 最简单的查询表达式
        {filed:value} ,是指查询field列的值为value的文档

        2: $ne --- != 查询表达式
        {field:{$nq:value}}
        作用--查filed列的值 不等于 value 的文档
           $gt--大于
               $lt--小于
           $lte小于等于
             $gte大于等于
        3: $nin --> not in
            {
                $nin
                [{cat_id:{$ne:30}},
                {cat_id:{$eq:300}}
                ]
            }

        4: $all
        语法: {field:{$all:[v1,v2..]}}
        是指取出 field列是一个数组,且至少包含 v1,v2值

        5、$or $and
            {
                $and:
                [{shop_price:{$gte:30}},
                {shop_price:{$lte:300}}
                ]
            }
            {
                $or
                [{shop_price:{$ne:30}},
                {shop_price:{$eq:300}}
                ]
            }
        6: $nor,
        {$nor,[条件1,条件2]}
        是指  所有条件都不满足的文档为真返回
        7、取模 $mod
            {
                goods_id:{$mode:[5,0]},

            },
            {
                goods_id:1,
                goods_name:1,
                _id:0
            }
        8、$exists 存在某一列则查出来
            {
                age:{$exists:1}
            },
            {
                goods_id:1,
                goods_name:1,
                _id:0
            }
        9、$type 按类型查询
            {
                age:{$type:2}
            }
          10、$where
            例: db.goods.find            ({$where:‘this.cat_id != 3 && this.cat_id != 11‘});
            直接将二进制数据转换为对象,对象的任何属性都可以导航得到、效率极低。不建议使用,好处是表达式可以写得很复杂和灵活
        11、用正则表达式查询 以”诺基亚”开头的商品
            例:db.goods.find({goods_name:/诺基亚.*/},{goods_name:1});
四、游标操作
        > var mycursor = db.bar.find({_id:{$lte:5}})
        > while(mycursor.hasNext()) {
        ... printjson(mycursor.next());
        ... }
五、用户管理
六、导入导出
七、副本集
    如果主服务器自动关掉
        rs.shutdownServer();
    会自动切换到别的服务器作为主服务器
    编写mongo副本集的自动化安装脚本:参考mongo副本集安装脚本.sh
八、分片
    分片配置
    1、启动两台mongo服务器
        mkdir -p /home/m17 /home/m18 /home/m20 /home/m30 /home/mlog
        mongd --dbpath /home/m17 --logpath /home/mlog/m17.log --fork --port 27017
        mongd --dbpath /home/m18 --logpath /home/mlog/m18.log --fork --port 27018
    2、配置configserver,管理meta信息
        mongd --dbpath /home/m20 --logpath /home/mlog/m20.log --fork --port 27020  --configserver
    3、配置一台mongo路由
        mongos --logpath /home/mlog/m30.log  --port 30000 --configdb 192.168.1.202:27020 --fork
    4、连接路由
        mongo --port 30000
    5、在路由节点增加片节点
        sh.addShard(‘192.168.10.202:27017‘)
        sh.addShard(‘192.168.10.202:27018‘)

    6、在路由节点查看路由状态,发现路由片节点信息
        sh.status();
    7、在路由节点插入数据
    8、路由节点有数据,发现17有数据,18没有数据。因为没有加入路由规则的原因
    9、sh.status 可以看到数据库,分区false,优先被放在shard0000
    10、针对数据库启用分片
        sh.enableShard(‘shard‘);
    11、sh.status 可以看到数据库shop,分区false,优先被放在shard0000
    12、添加分片的表
        sh.shardCollection(‘shop.goods’,{good_id:1});
        将good_id作为片键
    13、查看sh.status,可以看到现实目前分片信息先落在shard0001
    14、插入3W条数据
    15、查看sh.status ,看到数据都落在shard0001上
    16、再插入10W条数据,看到数据还是都落在shard0001上
    17、上面疑问的原因如下:

        mongodb不是从单篇文档的级别,绝对平均的散落在各个片上,

        而是N篇文档,形成一个块"chunk",
        优先放在某个片上,
        当这片上的chunk,比另一个片的chunk,区别比较大时, (>=3) ,会把本片上的chunk,移到另一个片上, 以chunk为单位,
        维护片之间的数据均衡

        问: 为什么插入了10万条数据,才2个chunk?
        答: 说明chunk比较大(默认是64M)
        在config数据库中,修改chunksize的值.

        问: 既然优先往某个片上插入,当chunk失衡时,再移动chunk,
        自然,随着数据的增多,shard的实例之间,有chunk来回移动的现象,这将带来什么问题?
        答: 服务器之间IO的增加,

        接上问: 能否我定义一个规则, 某N条数据形成1个块,预告分配M个chunk,
        M个chunk预告分配在不同片上.
        以后的数据直接入各自预分配好的chunk,不再来回移动?

        答: 能, 手动预先分片!
    18、在config数据库,修改chunk
        use config;
        show tables;
        db.settings.find();
        db.settings.save({_id:chunksize},{$set:{value:1}})
    19、查看分片信息
        sh.status();
    20、继续插入更多数据15W吧 50W也可以的
    21、查看分片信息
        sh.status();
    22、可以看到两台片节点的分片数量大致平衡

    手动预先分片:
        1、对shop库下的user表分片,片键为userid
        sh.shardingCollection(‘shop.user‘,{userid:1})
        2、sh.status();
        3、模拟:40个块每个块1000条数据
        4、定义规则
            for(var i = 1;i<=40;i++){
                sh.splitAt(‘shop.user‘,{userid:i*1000});        

            }
            这样将会有40个chunk,这些chunk会平均分布到各节点上,这样插入的时候就不会产生chunk频繁移动的现象了
        5、快速查看分片信息
            sh.status();
        6、插入4W条数据
            for(var i = 0;i<40000;i++){
                db.user.insert({userid:i,name:‘nnnn hello‘});
            }
        7、查看两个分片节点的总数据,各2W条数据
九、分片和副本集配合
    B--configserver
    C--副本集
    D--副本集
        1、分别创建副本集C、D,利用脚本自动化创建
        2、副本集C,D可以认为是一台机器,将分片节点设置到C、D的主节点即可
        3、配置configserver,管理meta信息
        mongd --dbpath /home/m20 --logpath /home/mlog/m20.log --fork --port 27020  --configsvr
        4、配置一台mongo路由
        mongos --logpath /home/mlog/m30.log  --port 30000 --configdb 192.168.1.202:27020 --fork

        5、在路由节点增加片节点
        sh.addShard(‘rs3/192.168.10.203:27017‘)#假设203的27017就是C的主节点
        sh.addShard(‘rs4/192.168.10.203:27018‘)#假设203的27017就是D的主节点
        6、添加需要分片的库
            sh.enableSharding(‘shop‘);
        7、添加需要分片的表
            sh.shardCollection(‘shop.user‘,{userid:1});
        8、手动分片测试
            sh.splitAt(‘shop.user‘,{userid:1000})#1千条数据拆分一下
            sh.splitAt(‘shop.user‘,{userid:2000})#两千条数据后拆分一下
            sh.splitAt(‘shop.user‘,{userid:3000})#3千条数据后拆分一下

        9、插入数据
            for(var i = 0;i<4000;i++){

                    db.user.insert({    userid:i,intro:‘i am lili‘});

            }
        10、查看两个副本集的数据量
            包括主节点和从节点
        11、移除某个分片
            use admin
            db.runCommand({removeShard:"rs2"})
        12、查询分片上的信息
            sh.status();
            可以看到被移除分片的数据移动到别的分片上
            并且被移除分片被标记上"draining" : true
        13、将移除的分片恢复
            db.shards.update({"_id" : "rs2"},{$unset:{draining:true}}, false, true)
            可以看到分片的数据移动到恢复的分片的上
        14、
十、网址转换项目
    1、功能说明
        *输入网址
        *点击变短
        *生成比较短的网址
        *如果已经存在短网址,提示已经存在
        *需要存储数据
            原网址        短网址
    2、短网址生成
    3、PHP连接mongodb编译扩展

mongodb学习笔记系列一,布布扣,bubuko.com

时间: 2024-10-22 08:48:39

mongodb学习笔记系列一的相关文章

MongoDB学习笔记系列

回到占占推荐博客索引 该来的总会来的,Ef,Redis,MVC甚至Sqlserver都有了自己的系列,MongoDB没有理由不去整理一下,这个系列都是平时在项目开发时总结出来的,希望可以为各位一些帮助和启发,文章中有对新技术的研究(Mongo驱动),对老技术的回顾(代码重构),还有对架构设计的阐述等(面向接口编程,对扩展开放,对修改关闭,所以出现了IMongoRepository接口). MongoDB学习笔记系列~目录 MongoDB学习笔记~环境搭建 (2015-03-30 10:34) M

MongoDB学习笔记系列 一

主题:MongoDB 学习资料参考网址: 1.http://www.w3cschool.cc/mongodb/mongodb-tutorial.html 2.http://www.icoolxue.com/ 1.NoSQL数据库. 运行速度快:设计灵活.(facebook就是用这个做的.) JavaScript,Shell的基本操作. Bson的扩充类型.(Json增加了数据类型) 2.

系列文章--Node.js学习笔记系列

Node.js学习笔记系列总索引 Nodejs学习笔记(一)--- 简介及安装Node.js开发环境 Nodejs学习笔记(二)--- 事件模块 Nodejs学习笔记(三)--- 模块 Nodejs学习笔记(四)--- 与MySQL交互(felixge/node-mysql) Nodejs学习笔记(五)--- Express安装入门与模版引擎ejs Nodejs学习笔记(六)--- Node.js + Express 构建网站预备知识 Nodejs学习笔记(七)--- Node.js + Exp

[MongoDB]学习笔记--Linux 安装和运行MongoDB

背景知识 MongoDB 是用C++写的, 开源的, NoSQL(Not Only SQL)文档数据库. 特点:high performance(高性能), high availability(高可靠性), and automatic scaling(自动调整). 结构与JSON类似. 安装 1. 下载安装包 www.mongodb.org/downloads curl -O http://downloads.mongodb.org/linux/mongodb-linux-x86_64-2.6.

vsphere学习笔记系列-cluster&amp;resources pool

cluster集群  要实现vmotion.DRS.HA等功能,EXSI主机必须是两台或以上的数量.那怎么判断vmotion等漂移功能在哪些主机执行的呢?这就引出了集群cluster的概念.所有基于vmotion的功能都是在集群内的EXSI主机实现的,VM只会在集群内做漂移. 所有EXSI主机加入集群后,CPU.内存等资源都会池化成集群的资源,由集群分配资源给VM.因此,我们可以看到在集群中,EXSI主机和VM是同等级别的排序,而不像在非集群环境中VM和EXSI是从属关系. 值得注意的是虽然由集

MongoDB学习笔记一:MongoDB的下载和安装

趁着这几天比较空闲,准备学习一下MongoDB数据库,今天就简单的学习了一些MongoDB的下载和安装,并创建了存储MongoDB的数据仓库.将自己今天学习到的写成博客分享给大家. 一.MongoDB的下载和安装 MongoDB的下载地址为:http://www.mongodb.org/ 1.进入官网的首页后,在首页的右上方单击Downloads连接,如图所示: 2.在页面中可以看到目前最新的版本和以前发布过的版本,这里选择最新版本,windows 32位的进行下载,文件的格式为ZIP格式的,单

MongoDB学习笔记(一:安装时出现The default storage engine &#39;wiredTiger&#39; is not available问题解决)

今晚在自己老式笔记本来试了一下MongoDB的安装,由于配置比较低,只能选择32位版本的MongoDB进行安装,在安装过程中碰到了上述标题所示错误,自己也捣鼓了一个小时左右,终于在一篇博客中找到答案,具体原文链接如下:http://blog.csdn.net/u013457382/article/details/50775268 MongoDB学习笔记(一:安装时出现The default storage engine 'wiredTiger' is not available问题解决)

Mongodb学习笔记

总结下这几天Mongodb学习笔记 /** * 获取MongoClient * @author xuyw * @email [email protected] * @param host * @param port * @return */ public static MongoClient getMongoClient(String host, int... port) { MongoClient mongoClient = null; int portlen = 0; try { if (p

[Spring Data MongoDB]学习笔记--建立数据库的连接

1. 有了上一篇的Mongo后,连接数据库我们还需要更多的信息,比如数据库名字,用户名和密码等. 我们可以继续来配置MongoDbFactory的实例. public interface MongoDbFactory { DB getDb() throws DataAccessException; DB getDb(String dbName) throws DataAccessException; } 然后我们可以继续用MongoDbFactory来创建MongoTemplate的实例. pu