1. 一、简介和安装
  2. ./bin/mongod --dbpath /path/to/database --logpath /path/to/log --fork --port 27017
  3. mongodb非常的占磁盘空间, 刚启动后要占3-4G左右,--smallfiles
  4. 二、基本命令
  5. 1、登录mongodb client
  6. /use/local/mongo
  7. 2、查看当前数据库
  8. show databases;
  9. show dbs;
  10. 两个可能
  11. 3admin是和管理有关的库,local 是放schema有关的内容,不要乱动
  12. 4、切换到数据库
  13. use admin;
  14. show tables;
  15. 或者
  16. show collections;
  17. admin下的表不要随便操作。
  18. 5db help查看数据库操作帮助命令
  19. 6、创建数据库:mongo是隐式创建
  20. use shop;
  21. 7、创建表[集合]
  22. db.createcollection('user');
  23. 8show dbs;
  24. 9、查看表[集合]
  25. show collections
  26. 10、插入数据
  27. db.user.insert({name:lisi,age:22});
  28. 11、查看数据:db.user.find();
  29. 12db.user.insert(id:3,name:'hmm',hoby:['basketball','fottball'],intro:{title:'my intro'});
  30. 13collection也是不用显示创建的
  31. 14db.goods.insert(_id:1,name:'n1',price:133);
  32. 由此可见不用显示创建collection
  33. 15、删除collection
  34. db.user.drop();//删除集合user
  35. 16db.dropDatabase();//删除database;
  36. 三、CRUD操作
  37. 1、增加单篇文档
  38. db.stu.insert({sn:001,name,'xiaoming'});
  39. 覆盖默认ID
  40. db.stu.insert({_id:002,sn:002,name:'lisi'});
  41. 2、批量插入
  42. db.stu.insert({_id:3,sn:003,name:guangyu},{_id:4,sn:004,name:zhangwei});
  43. 3、插入无限制深度的文档
  44. db.stu.insert({name:x:'li',m:'shimin'},{jli:'xxx'})
  45. 4、删除
  46. db.stu.remove({sn:001});
  47. 删除sn001的文档
  48. 5、删除全部
  49. db.stu.remove();
  50. 6、查询表达式是json对象
  51. 7、继续删除
  52. db.stu.remove(gender:'m');
  53. db.stu.remove(gender:'m'true);
  54. true限制只能删除一行
  55.  
  56. 8、错误的修改
  57. db.stu.update({name:'zhangsan'},{name:'lisi'});
  58. 前一个表达式为想要修改的操作,后一个表达式表示要改成什么样。这个修改有问题,新文档直接替换旧文档,其他属性都不见了。
  59. 9、正确的修改
  60. db.stu.update({name:'poxi'},{$set:{name:'yanpoxi'}});
  61. $set 修改
  62. $unset 重设 1-->true 0-->false
  63. $rename 重命名
  64. $inc 增长
  65.  
  66. db.stu.update(
  67. {name:'wukong'},
  68. {
  69. $set:{name:'douzhanshengfo'},
  70. $unset:{jinggu:1},
  71. $rename:{set:gender},
  72. $inc:{age:2}
  73. }
  74. );
  75.  
  76. 10multi 修改多行
  77. db.stu.update({
  78. {gender:'m'},
  79. {gender:'male'},
  80. {multi:1}
  81. })
  82. multiple表示可修改多行,不加只能修改匹配多行中的一行
  83. 11upsert $setonInsert
  84. db.stu.update(
  85. {name:'wuyong'},
  86. {$set:{name:'junshiwuyong'}}
  87. );
  88. 如果没有wuyong这个人,那么将不做任何修改
  89. db.stu.update(
  90. {name:'wuyong'},
  91. {$set:{name:'junshiwuyong'}},
  92. {upsert:true}
  93. );
  94. 如果添加upserttrue,那么自动插入
  95. 但是这还是有问题,原来的字段会丢失
  96. 这个时候需要upsertsetOnInsert
  97. db.stu.update(
  98. {name:'wuyong'},
  99. {$set:{name:'junshiwuyong'}},
  100. {upsert:true},
  101. {$setOnInsert:{gender:'male'}}//加上原来的字段
  102. );
  103. 12、查询
  104. 查询所有文档所有内容
  105. db.stu.find();
  106. 查询所有文档的gender属性
  107. db.stu.find({},{gender:1})
  108. 查询所有文档的gender属性,且不查询_id属性
  109. db.stu.find({},{gender:1,_id:0})
  110.  
  111. 四:深入查询表达式
  112. 1: 最简单的查询表达式
  113. {filed:value} ,是指查询field列的值为value的文档
  114.  
  115. 2: $ne --- != 查询表达式
  116. {field:{$nq:value}}
  117. 作用--查filed列的值 不等于 value 的文档
  118. $gt--大于
  119. $lt--小于
  120. $lte小于等于
  121. $gte大于等于
  122. 3: $nin --> not in
  123. {
  124. $nin
  125. [{cat_id:{$ne:30}},
  126. {cat_id:{$eq:300}}
  127. ]
  128. }
  129.  
  130. 4: $all
  131. 语法: {field:{$all:[v1,v2..]}}
  132. 是指取出 field列是一个数组,且至少包含 v1,v2
  133.  
  134. 5$or $and
  135. {
  136. $and:
  137. [{shop_price:{$gte:30}},
  138. {shop_price:{$lte:300}}
  139. ]
  140. }
  141. {
  142. $or
  143. [{shop_price:{$ne:30}},
  144. {shop_price:{$eq:300}}
  145. ]
  146. }
  147. 6: $nor,
  148. {$nor,[条件1,条件2]}
  149. 是指 所有条件都不满足的文档为真返回
  150. 7、取模 $mod
  151. {
  152. goods_id:{$mode:[5,0]},
  153.  
  154. },
  155. {
  156. goods_id:1,
  157. goods_name:1,
  158. _id:0
  159. }
  160. 8$exists 存在某一列则查出来
  161. {
  162. age:{$exists:1}
  163. },
  164. {
  165. goods_id:1,
  166. goods_name:1,
  167. _id:0
  168. }
  169. 9$type 按类型查询
  170. {
  171. age:{$type:2}
  172. }
  173. 10$where
  174. 例: db.goods.find ({$where:'this.cat_id != 3 && this.cat_id != 11'});
  175. 直接将二进制数据转换为对象,对象的任何属性都可以导航得到、效率极低。不建议使用,好处是表达式可以写得很复杂和灵活
  176. 11、用正则表达式查询 以”诺基亚”开头的商品
  177. 例:db.goods.find({goods_name:/诺基亚.*/},{goods_name:1});
  178. 四、游标操作
  179. > var mycursor = db.bar.find({_id:{$lte:5}})
  180. > while(mycursor.hasNext()) {
  181. ... printjson(mycursor.next());
  182. ... }
  183. 五、用户管理
  184. 六、导入导出
  185. 七、副本集
  186. 如果主服务器自动关掉
  187. rs.shutdownServer();
  188. 会自动切换到别的服务器作为主服务器
  189. 编写mongo副本集的自动化安装脚本:参考mongo副本集安装脚本.sh
  190. 八、分片
  191. 分片配置
  192. 1、启动两台mongo服务器
  193. mkdir -p /home/m17 /home/m18 /home/m20 /home/m30 /home/mlog
  194. mongd --dbpath /home/m17 --logpath /home/mlog/m17.log --fork --port 27017
  195. mongd --dbpath /home/m18 --logpath /home/mlog/m18.log --fork --port 27018
  196. 2、配置configserver,管理meta信息
  197. mongd --dbpath /home/m20 --logpath /home/mlog/m20.log --fork --port 27020 --configserver
  198. 3、配置一台mongo路由
  199. mongos --logpath /home/mlog/m30.log --port 30000 --configdb 192.168.1.202:27020 --fork
  200. 4、连接路由
  201. mongo --port 30000
  202. 5、在路由节点增加片节点
  203. sh.addShard('192.168.10.202:27017')
  204. sh.addShard('192.168.10.202:27018')
  205.  
  206. 6、在路由节点查看路由状态,发现路由片节点信息
  207. sh.status();
  208. 7、在路由节点插入数据
  209. 8、路由节点有数据,发现17有数据,18没有数据。因为没有加入路由规则的原因
  210. 9sh.status 可以看到数据库,分区false,优先被放在shard0000
  211. 10、针对数据库启用分片
  212. sh.enableShard('shard');
  213. 11sh.status 可以看到数据库shop,分区false,优先被放在shard0000
  214. 12、添加分片的表
  215. sh.shardCollection(‘shop.goods’,{good_id:1});
  216. good_id作为片键
  217. 13、查看sh.status,可以看到现实目前分片信息先落在shard0001
  218. 14、插入3W条数据
  219. 15、查看sh.status ,看到数据都落在shard0001
  220. 16、再插入10W条数据,看到数据还是都落在shard0001
  221. 17、上面疑问的原因如下:
  222.  
  223. mongodb不是从单篇文档的级别,绝对平均的散落在各个片上,
  224.  
  225. 而是N篇文档,形成一个块"chunk",
  226. 优先放在某个片上,
  227. 当这片上的chunk,比另一个片的chunk,区别比较大时, (>=3) ,会把本片上的chunk,移到另一个片上, chunk为单位,
  228. 维护片之间的数据均衡
  229.  
  230. 问: 为什么插入了10万条数据,才2chunk?
  231. 答: 说明chunk比较大(默认是64M)
  232. config数据库中,修改chunksize的值.
  233.  
  234. 问: 既然优先往某个片上插入,当chunk失衡时,再移动chunk,
  235. 自然,随着数据的增多,shard的实例之间,有chunk来回移动的现象,这将带来什么问题?
  236. 答: 服务器之间IO的增加,
  237.  
  238. 接上问: 能否我定义一个规则, N条数据形成1个块,预告分配Mchunk,
  239. Mchunk预告分配在不同片上.
  240. 以后的数据直接入各自预分配好的chunk,不再来回移动?
  241.  
  242. 答: 能, 手动预先分片!
  243. 18、在config数据库,修改chunk
  244. use config;
  245. show tables;
  246. db.settings.find();
  247. db.settings.save({_id:chunksize},{$set:{value:1}})
  248. 19、查看分片信息
  249. sh.status();
  250. 20、继续插入更多数据15W 50W也可以的
  251. 21、查看分片信息
  252. sh.status();
  253. 22、可以看到两台片节点的分片数量大致平衡
  254.  
  255. 手动预先分片:
  256. 1、对shop库下的user表分片,片键为userid
  257. sh.shardingCollection('shop.user',{userid:1})
  258. 2sh.status();
  259. 3、模拟:40个块每个块1000条数据
  260. 4、定义规则
  261. for(var i = 1;i<=40;i++){
  262. sh.splitAt('shop.user',{userid:i*1000});
  263.  
  264. }
  265. 这样将会有40chunk,这些chunk会平均分布到各节点上,这样插入的时候就不会产生chunk频繁移动的现象了
  266. 5、快速查看分片信息
  267. sh.status();
  268. 6、插入4W条数据
  269. for(var i = 0;i<40000;i++){
  270. db.user.insert({userid:i,name:'nnnn hello'});
  271. }
  272. 7、查看两个分片节点的总数据,各2W条数据
  273. 九、分片和副本集配合
  274. B--configserver
  275. C--副本集
  276. D--副本集
  277. 1、分别创建副本集CD,利用脚本自动化创建
  278. 2、副本集CD可以认为是一台机器,将分片节点设置到CD的主节点即可
  279. 3、配置configserver,管理meta信息
  280. mongd --dbpath /home/m20 --logpath /home/mlog/m20.log --fork --port 27020 --configsvr
  281. 4、配置一台mongo路由
  282. mongos --logpath /home/mlog/m30.log --port 30000 --configdb 192.168.1.202:27020 --fork
  283.  
  284. 5、在路由节点增加片节点
  285. sh.addShard('rs3/192.168.10.203:27017')#假设20327017就是C的主节点
  286. sh.addShard('rs4/192.168.10.203:27018')#假设20327017就是D的主节点
  287. 6、添加需要分片的库
  288. sh.enableSharding('shop');
  289. 7、添加需要分片的表
  290. sh.shardCollection('shop.user',{userid:1});
  291. 8、手动分片测试
  292. sh.splitAt('shop.user',{userid:1000})#1千条数据拆分一下
  293. sh.splitAt('shop.user',{userid:2000})#两千条数据后拆分一下
  294. sh.splitAt('shop.user',{userid:3000})#3千条数据后拆分一下
  295.  
  296. 9、插入数据
  297. for(var i = 0;i<4000;i++){
  298.  
  299. db.user.insert({ userid:i,intro:'i am lili'});
  300.  
  301. }
  302. 10、查看两个副本集的数据量
  303. 包括主节点和从节点
  304. 11、移除某个分片
  305. use admin
  306. db.runCommand({removeShard:"rs2"})
  307. 12、查询分片上的信息
  308. sh.status();
  309. 可以看到被移除分片的数据移动到别的分片上
  310. 并且被移除分片被标记上"draining" : true
  311. 13、将移除的分片恢复
  312. db.shards.update({"_id" : "rs2"},{$unset:{draining:true}}, false, true)
  313. 可以看到分片的数据移动到恢复的分片的上
  314. 14
  315. 十、网址转换项目
  316. 1、功能说明
  317. *输入网址
  318. *点击变短
  319. *生成比较短的网址
  320. *如果已经存在短网址,提示已经存在
  321. *需要存储数据
  322. 原网址 短网址
  323. 2、短网址生成
  324. 3PHP连接mongodb编译扩展

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

  1. MongoDB学习笔记系列

    回到占占推荐博客索引 该来的总会来的,Ef,Redis,MVC甚至Sqlserver都有了自己的系列,MongoDB没有理由不去整理一下,这个系列都是平时在项目开发时总结出来的,希望可以为各位一些帮助 ...

  2. MongoDB学习笔记系列~目录

    MongoDB学习笔记~环境搭建 (2015-03-30 10:34) MongoDB学习笔记~MongoDBRepository仓储的实现 (2015-04-08 12:00) MongoDB学习笔 ...

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

    Node.js学习笔记系列总索引 Nodejs学习笔记(一)--- 简介及安装Node.js开发环境 Nodejs学习笔记(二)--- 事件模块 Nodejs学习笔记(三)--- 模块 Nodejs学 ...

  4. MongoDB 学习笔记(一):安装及简单shell操作

    一.说明 1.该系列MongoDB学习笔记的学习环境采用的MongoDB版本为mongodb-win32-i386-2.4.6,操作系统为win7. 二.安装 1.新建两个目录,分别是D:\Insta ...

  5. MongoDB学习笔记:快速入门

    MongoDB学习笔记:快速入门   一.MongoDB 简介 MongoDB 是由C++语言编写的,是一个基于分布式文件存储的开源数据库系统.在高负载的情况下,添加更多的节点,可以保证服务器性能.M ...

  6. PHP操作MongoDB学习笔记

    <?php/*** PHP操作MongoDB学习笔记*///*************************//**   连接MongoDB数据库  **////*************** ...

  7. Dynamic CRM 2013学习笔记 系列汇总

    这里列出所有 Dynamic CRM 2013学习笔记 系列文章,方便大家查阅.有任何建议.意见.需要,欢迎大家提交评论一起讨论. 本文原文地址: Dynamic CRM 2013学习笔记 系列汇总 ...

  8. SQLServer学习笔记系列3

    一.写在前面的话 今天又是双休啦!生活依然再继续,当你停下来的时候,或许会突然显得不自在.有时候,看到一种东西,你会发现原来在这个社会上,优秀的人很多,默默 吃苦努力奋斗的人也多!星期五早上按时上班, ...

  9. SQLServer学习笔记系列2

    一.写在前面的话 继上一次SQLServer学习笔记系列1http://www.cnblogs.com/liupeng61624/p/4354983.html以后,继续学习Sqlserver,一步一步 ...

随机推荐

  1. nfs 存储服务

    今日内容: NFS 1.什么是nfs? network file system 网络文件系统 nfs共享存储 2.nfs能干什么? nfs 能为 不同主机系统之间 实现 文件的共享 3.为什么要使用n ...

  2. PTA A1013

    第七天 A1013 Battle Over Cities (25 分) 题目内容 It is vitally important to have all the cities connected by ...

  3. Netty源码分析 (十二)----- 心跳服务之 IdleStateHandler 源码分析

    什么是心跳机制? 心跳说的是在客户端和服务端在互相建立ESTABLISH状态的时候,如何通过发送一个最简单的包来保持连接的存活,还有监控另一边服务的可用性等. 心跳包的作用 保活Q:为什么说心跳机制能 ...

  4. jsp 中include使用问题

    如果在需要在jsp页面做页面包含时 会使用到include 指令 来进行页面包含操作 这里是页面的头部 文件名称是head.jsp <%@ page language="java&qu ...

  5. gym102346题解

    B Buffoon 判断最大值是不是第一个数,签到题. H Hour for a Run 输出\(n*m\)的\(10\%\)到\(90\%\),签到题,注意别用浮点数和ceil,有精度问题. M M ...

  6. 2019-2020-1 20199303《Linux内核原理与分析》第三周作业

    操作系统是如何工作的 除了存储程序计算机和函数调用堆栈机制,还有一个非常基础的概念就是中断,这三个关键性的方法机制可以称作计算机的三个法宝:程序存储计算机.函数调用.中断 堆栈的作用:记录函数调用框架 ...

  7. python实现感知机线性分类模型

    前言 感知器是分类的线性分类模型,其中输入为实例的特征向量,输出为实例的类别,取+1或-1的值作为正类或负类.感知器对应于输入空间中对输入特征进行分类的超平面,属于判别模型. 通过梯度下降使误分类的损 ...

  8. Spring Data JPA 梳理 - JPA是什么

    总结: JPA是java的标准,不是Spring的标准 java标准中一般通过Meta-INF文件规范开发层面的事情,JPA也不例外,使用persistence.xml JPA定义了Entity 到 ...

  9. freemarker常见语法

    FreeMarker的插值有如下两种类型:1,通用插值${expr};2,数字格式化插值:#{expr}或#{expr;format}  ${basketball.name?if_exists } / ...

  10. SUSE Storage6 环境搭建详细步骤 - Win10 + VMware WorkStation

    学习 SUSE Storage 系列文章 (1)SUSE Storage6 实验环境搭建详细步骤 - Win10 + VMware WorkStation (2)SUSE Linux Enterpri ...