mongodb 之 特殊集合及索引

原文链接地址:http://blog.csdn.net/miyatang/article/details/38610617


1、固定集合 

      一般的集合都是动态的,可以自动增长以容纳越来越多的数据。


但MongoDB 还有另外一种集合:固定集合。集合大小创建时指定。如果没有空间了,就会自动删除最老的文档,以释放空间。(类似以一个循环队列)


mongodb 之 特殊集合及索引_第1张图片mongodb 之 特殊集合及索引_第2张图片


数据插入是按顺序进行                                              当队列已占满,最老的数据被覆盖                                                                                                        


固定集合 :

它在碟式磁盘上写入速度非常快,尤其是有专用磁盘时(不会被其它集合的一些随机

性写操作而打扰)



示例:

创建:Size:存储空间为: 10,000 kb    Max: 记录数

[javascript]  view plain  copy
 print ?
  1. > db.createCollection("capped_t1",{"capped":true,"size":100000,"max":100});  
  2. "ok" : 1 }  
  3. for (i = 1; i <= 101; i++){ db.capped_t1.insert({_id:i,name:i+' name'}) }  
  4. > db.capped_t1.count()  
  5. 100  
  6.   
  7.   
  8. > db.capped_t1.find().sort({_id:-1}).limit(5)  
  9. "_id" : 101, "name" : "101 name" }  
  10. "_id" : 100, "name" : "100 name" }  
  11. "_id" : 99, "name" : "99 name" }  
  12. "_id" : 98, "name" : "98 name" }  
  13. "_id" : 97, "name" : "97 name" }  
  14. > db.capped_t1.find().sort({_id:1}).limit(5)  
  15. "_id" : 2, "name" : "2 name" }  
  16. "_id" : 3, "name" : "3 name" }  
  17. "_id" : 4, "name" : "4 name" }  
  18. "_id" : 5, "name" : "5 name" }  
  19. "_id" : 6, "name" : "6 name" }  
  20. >   


我们来检查一下集合的物理排序顺序 : (mongodb里叫自然排序的方法 )

这种方法看到的顺序,就是文档在磁盘上的顺序。


[javascript]  view plain  copy
 print ?
  1. > db.capped_t1.find().sort({$natural:1}).limit(10)  
  2. "_id" : 2, "name" : "2 name" }  
  3. "_id" : 3, "name" : "3 name" }  
  4. "_id" : 4, "name" : "4 name" }  
  5. "_id" : 5, "name" : "5 name" }  
  6. "_id" : 6, "name" : "6 name" }  
  7. "_id" : 7, "name" : "7 name" }  
  8. "_id" : 8, "name" : "8 name" }  
  9. "_id" : 9, "name" : "9 name" }  
  10. "_id" : 10, "name" : "10 name" }  
  11. "_id" : 11, "name" : "11 name" }  
  12. >   


这里 插播一内容


上一讲我们讲到一个[稀疏索引],如果我建立了索引后,按索引走是查询不到没有此字段的数据。

这里我们也可以使用{$natural:1}

指定不用索引来强制全表或其它索引搜索。

代码如下:


[javascript]  view plain  copy
 print ?
  1. > db.foo.find({x:{$ne:2}}).hint({$natural:1})    
  2. "_id" : 0 }    
  3. "_id" : 1, "x" : 1 }    
  4. "_id" : 3, "x" : 3 }    
  5. >   

2.循环游标

循环游标类似于 tail –f 命令 ,当循环游标数据被取光后,游标不会被关闭,当有数据插入后,游标还可以取到结果。

[javascript]  view plain  copy
 print ?
  1. $cursor = $collection->find()->tailable();  
  2. while (true) {  
  3.     if (!$cursor->hasNext()) {  
  4.         if ($cursor->dead()) {  
  5.             break;  
  6.         }  
  7.         sleep(1);  
  8.     }  
  9.     else {  
  10.         while ($cursor->hasNext()) {  
  11.                    do_stuff($cursor->getNext());  
  12.         }  
  13.     }  
  14. }  
  15.   
  16. (不能在mongodb shell 中使用循环游标)  


循环游标如果超过10分钟没有新的数据插入,游标被释放。

3.没有_id 字段??

我们现在使用的集合中,都有个默认的_id字段。它使用:唯一值,可以在分布数据库中保持数据文档的唯一性。

但如果我数据不修改,只插入,也不管它是不是唯一
指定:  {autoIndexId:false}可以建立无_id集合。

优点:性能有稍许提升;
缺点:集合无法复制;


4.TTL索引


使用TTL 可以设置一个时间范围,如果到了此范围,文档被删除。(开始我理解错误,一直以为TTL 是使用在固定集合中的一个索引,并测试一直发现索引无效,经多次测试,才发现,自己理解错误)


[javascript]  view plain  copy
 print ?
  1. db.log_events.ensureIndex( { "createdAt": 1 }, { expireAfterSeconds: 3600 } )  
  2.   
  3. > db.log_events.find({},{createdAt:1,_id:0})  
  4. "createdAt" : ISODate("2014-07-28T03:59:46.824Z") }  
  5. "createdAt" : ISODate("2014-07-28T04:01:36.816Z") }  
  6. > db.log_events.insert( {    "createdAt"new Date('2014,07,28'),    "logEvent": 2,    "logMessage""Success!" } )  
  7. > db.log_events.find({},{createdAt:1,_id:0})  
  8. "createdAt" : ISODate("2014-07-28T03:59:46.824Z") }  
  9. "createdAt" : ISODate("2014-07-28T04:01:36.816Z") }  
  10. "createdAt" : ISODate("2014-07-27T16:00:00Z") }  
  11.  > db.log_events.find({},{createdAt:1,_id:0})  
  12. "createdAt" : ISODate("2014-07-28T03:59:46.824Z") }  
  13. "createdAt" : ISODate("2014-07-28T04:01:36.816Z") }  
  14. > > new Date()  
  15. ISODate("2014-07-28T05:33:15.398Z")  
  16. > db.log_events.find({},{createdAt:1,_id:0})  
  17. >   

建立索引后,插入数据,并测试查看经过一段时间后,数据已清空。



注意,开始照:MONGODB 权威指南书里的实验来做,简写成:{expireAfterSecs:3600} 是无效的。
实验如下:
[javascript]  view plain  copy
 print ?
  1. > db.bid.insert({_id:1,create_dt:new Date('2014,08,01')})  
  2. > db.bid.insert({_id:2,create_dt:new Date('2014,11,01')})  
  3. > db.bid.ensureIndex({create_dt:1},{"expireAfterSecs":60*60*24*14})  
  4. > db.bid.getIndexes()  
  5. [  
  6.     {  
  7.         "v" : 1,  
  8.         "key" : {  
  9.             "_id" : 1  
  10.         },  
  11.         "ns" : "test.bid",  
  12.         "name" : "_id_"  
  13.     },  
  14.     {  
  15.         "v" : 1,  
  16.         "key" : {  
  17.             "create_dt" : 1  
  18.         },  
  19.         "ns" : "test.bid",  
  20.         "name" : "create_dt_1",  
  21.         "expireAfterSecs" : 1209600  
  22.     }  
  23. ]  
  24. > db.bid.find()  
  25. "_id" : 1, "create_dt" : ISODate("2014-07-31T16:00:00Z") }  
  26. "_id" : 2, "create_dt" : ISODate("2014-10-31T16:00:00Z") }  
  27. > db.bid.find()  
  28. "_id" : 1, "create_dt" : ISODate("2014-07-31T16:00:00Z") }  
  29. "_id" : 2, "create_dt" : ISODate("2014-10-31T16:00:00Z") }  
  30. > db.bid.find()  
  31. "_id" : 1, "create_dt" : ISODate("2014-07-31T16:00:00Z") }  
  32. "_id" : 2, "create_dt" : ISODate("2014-10-31T16:00:00Z") }  
  33. > db.bid.find()  
  34. "_id" : 1, "create_dt" : ISODate("2014-07-31T16:00:00Z") }  
  35. "_id" : 2, "create_dt" : ISODate("2014-10-31T16:00:00Z") }  
  36. > db.bid.find()  
  37. "_id" : 1, "create_dt" : ISODate("2014-07-31T16:00:00Z") }  
  38. "_id" : 2, "create_dt" : ISODate("2014-10-31T16:00:00Z") }  
  39. > db.bid.find()  
  40. "_id" : 1, "create_dt" : ISODate("2014-07-31T16:00:00Z") }  
  41. "_id" : 2, "create_dt" : ISODate("2014-10-31T16:00:00Z") }  
  42. > db.bid.find()  
  43. "_id" : 1, "create_dt" : ISODate("2014-07-31T16:00:00Z") }  
  44. "_id" : 2, "create_dt" : ISODate("2014-10-31T16:00:00Z") }  
  45. > db.runCommand({"collMod":"someapp.cache","expireAfterSecs":60})  
  46. "ok" : 0, "errmsg" : "ns does not exist" }  
  47. > db.runCommand({"collMod":"someapp.cache","expireAfterSecs":60})  
  48. "ok" : 0, "errmsg" : "ns does not exist" }  
  49. > db.bid.find()  
  50. "_id" : 1, "create_dt" : ISODate("2014-07-31T16:00:00Z") }  
  51. "_id" : 2, "create_dt" : ISODate("2014-10-31T16:00:00Z") }  
  52. > db.bid.find()  
  53. "_id" : 1, "create_dt" : ISODate("2014-07-31T16:00:00Z") }  
  54. "_id" : 2, "create_dt" : ISODate("2014-10-31T16:00:00Z") }  
  55. > db.bid.find()  
  56. "_id" : 1, "create_dt" : ISODate("2014-07-31T16:00:00Z") }  
  57. "_id" : 2, "create_dt" : ISODate("2014-10-31T16:00:00Z") }  
  58. > db.bid.find()  
  59. "_id" : 1, "create_dt" : ISODate("2014-07-31T16:00:00Z") }  
  60. "_id" : 2, "create_dt" : ISODate("2014-10-31T16:00:00Z") }  
  61. > db.bid.find()  
  62. "_id" : 1, "create_dt" : ISODate("2014-07-31T16:00:00Z") }  
  63. "_id" : 2, "create_dt" : ISODate("2014-10-31T16:00:00Z") }  
  64. > db.bid.find()  
  65. "_id" : 1, "create_dt" : ISODate("2014-07-31T16:00:00Z") }  
  66. "_id" : 2, "create_dt" : ISODate("2014-10-31T16:00:00Z") }  
  67. > db.bid.find()  
  68. "_id" : 1, "create_dt" : ISODate("2014-07-31T16:00:00Z") }  
  69. "_id" : 2, "create_dt" : ISODate("2014-10-31T16:00:00Z") }  
  70. > db.bid.getIndexes()  
  71. [  
  72.     {  
  73.         "v" : 1,  
  74.         "key" : {  
  75.             "_id" : 1  
  76.         },  
  77.         "ns" : "test.bid",  
  78.         "name" : "_id_"  
  79.     },  
  80.     {  
  81.         "v" : 1,  
  82.         "key" : {  
  83.             "create_dt" : 1  
  84.         },  
  85.         "ns" : "test.bid",  
  86.         "name" : "create_dt_1",  
  87.         "expireAfterSecs" : 1209600  
  88.     }  
  89. ]  
  90. > db.bid.dropIndex("create_dt_1")  
  91. "nIndexesWas" : 2, "ok" : 1 }  
  92. > db.bid.getIndexes()  
  93. [  
  94.     {  
  95.         "v" : 1,  
  96.         "key" : {  
  97.             "_id" : 1  
  98.         },  
  99.         "ns" : "test.bid",  
  100.         "name" : "_id_"  
  101.     }  
  102. ]  
  103. > db.log_events.ensureIndex( { "createdAt": 1 }, { expireAfterSeconds: 3600 } )  
  104. > db.bid.ensureIndex( { "create_dt": 1 }, { expireAfterSeconds: 3600 } )  
  105. > db.bid.find()  
  106. "_id" : 1, "create_dt" : ISODate("2014-07-31T16:00:00Z") }  
  107. "_id" : 2, "create_dt" : ISODate("2014-10-31T16:00:00Z") }  
  108. > db.bid.find()  
  109. "_id" : 1, "create_dt" : ISODate("2014-07-31T16:00:00Z") }  
  110. "_id" : 2, "create_dt" : ISODate("2014-10-31T16:00:00Z") }  
  111. > db.bid.find()  
  112. "_id" : 1, "create_dt" : ISODate("2014-07-31T16:00:00Z") }  
  113. "_id" : 2, "create_dt" : ISODate("2014-10-31T16:00:00Z") }  
  114. > db.bid.getIndexes()  
  115. [  
  116.     {  
  117.         "v" : 1,  
  118.         "key" : {  
  119.             "_id" : 1  
  120.         },  
  121.         "ns" : "test.bid",  
  122.         "name" : "_id_"  
  123.     },  
  124.     {  
  125.         "v" : 1,  
  126.         "key" : {  
  127.             "create_dt" : 1  
  128.         },  
  129.         "ns" : "test.bid",  
  130.         "name" : "create_dt_1",  
  131.         "expireAfterSeconds" : 3600  
  132.     }  
  133. ]  
  134. > db.bid.getIndexes()  
  135. [  
  136.     {  
  137.         "v" : 1,  
  138.         "key" : {  
  139.             "_id" : 1  
  140.         },  
  141.         "ns" : "test.bid",  
  142.         "name" : "_id_"  
  143.     },  
  144.     {  
  145.         "v" : 1,  
  146.         "key" : {  
  147.             "create_dt" : 1  
  148.         },  
  149.         "ns" : "test.bid",  
  150.         "name" : "create_dt_1",  
  151.         "expireAfterSeconds" : 3600  
  152.     }  
  153. ]  
  154. > db.bid.find()  
  155. "_id" : 1, "create_dt" : ISODate("2014-07-31T16:00:00Z") }  
  156. "_id" : 2, "create_dt" : ISODate("2014-10-31T16:00:00Z") }  
  157. new Date()  
  158. ISODate("2014-11-05T03:10:34.828Z")  
  159. > db.bid.find()  
  160. "_id" : 1, "create_dt" : ISODate("2014-07-31T16:00:00Z") }  
  161. "_id" : 2, "create_dt" : ISODate("2014-10-31T16:00:00Z") }  
  162. > db.bid.find()  
  163. > db.bid.find()  
  164. > db.bid.dropIndex("create_dt_1")  
  165. "nIndexesWas" : 2, "ok" : 1 }  
  166. > db.bid.ensureIndex( { "create_dt": 1 }, { expireAfterSeconds: 3600*14 } )  
  167. > db.bid.insert({_id:1,create_dt:new Date('2014,08,01')})  
  168. > db.bid.insert({_id:1,create_dt:new Date('2014,01,01')})  
  169. E11000 duplicate key error index: test.bid.$_id_  dup key: { : 1.0 }  
  170. > db.bid.insert({_id:2,create_dt:new Date('2014,01,01')})  
  171. > db.bid.insert({_id:3,create_dt:new Date('2014,11,01')})  
  172. > db.bid.getIndexes()  
  173. [  
  174.     {  
  175.         "v" : 1,  
  176.         "key" : {  
  177.             "_id" : 1  
  178.         },  
  179.         "ns" : "test.bid",  
  180.         "name" : "_id_"  
  181.     },  
  182.     {  
  183.         "v" : 1,  
  184.         "key" : {  
  185.             "create_dt" : 1  
  186.         },  
  187.         "ns" : "test.bid",  
  188.         "name" : "create_dt_1",  
  189.         "expireAfterSeconds" : 50400  
  190.     }  
  191. ]  
  192. > db.bid.dropIndex("create_dt_1")  
  193. "nIndexesWas" : 2, "ok" : 1 }  
  194. > db.bid.ensureIndex( { "create_dt": 1 }, { expireAfterSeconds: 3600*24*14 } )  
  195. > db.bid.getIndexes()  
  196. [  
  197.     {  
  198.         "v" : 1,  
  199.         "key" : {  
  200.             "_id" : 1  
  201.         },  
  202.         "ns" : "test.bid",  
  203.         "name" : "_id_"  
  204.     },  
  205.     {  
  206.         "v" : 1,  
  207.         "key" : {  
  208.             "create_dt" : 1  
  209.         },  
  210.         "ns" : "test.bid",  
  211.         "name" : "create_dt_1",  
  212.         "expireAfterSeconds" : 1209600  
  213.     }  
  214. ]  
  215. > db.bid.find()  
  216. > db.bid.find()  
  217. > db.bid.insert({_id:3,create_dt:new Date('2014,11,01')})  
  218. > db.bid.find()  
  219. "_id" : 3, "create_dt" : ISODate("2014-10-31T16:00:00Z") }  
  220. > db.bid.insert({_id:2,create_dt:new Date('2014,01,01')})  
  221. > db.bid.find()  
  222. "_id" : 3, "create_dt" : ISODate("2014-10-31T16:00:00Z") }  
  223. "_id" : 2, "create_dt" : ISODate("2013-12-31T16:00:00Z") }  
  224. > db.bid.find()  
  225. "_id" : 3, "create_dt" : ISODate("2014-10-31T16:00:00Z") }  
  226. "_id" : 2, "create_dt" : ISODate("2013-12-31T16:00:00Z") }  
  227. > db.bid.find()  
  228. "_id" : 3, "create_dt" : ISODate("2014-10-31T16:00:00Z") }  
  229. "_id" : 2, "create_dt" : ISODate("2013-12-31T16:00:00Z") }  
  230. > db.bid.find()  
  231. "_id" : 3, "create_dt" : ISODate("2014-10-31T16:00:00Z") }  
  232. "_id" : 2, "create_dt" : ISODate("2013-12-31T16:00:00Z") }  
  233. > db.bid.find()  
  234. "_id" : 3, "create_dt" : ISODate("2014-10-31T16:00:00Z") }  
  235. "_id" : 2, "create_dt" : ISODate("2013-12-31T16:00:00Z") }  
  236. > db.bid.find()  
  237. "_id" : 3, "create_dt" : ISODate("2014-10-31T16:00:00Z") }  
  238. "_id" : 2, "create_dt" : ISODate("2013-12-31T16:00:00Z") }  
  239. > db.bid.find()  
  240. "_id" : 3, "create_dt" : ISODate("2014-10-31T16:00:00Z") }  
  241. > db.bid.find()  
  242. "_id" : 3, "create_dt" : ISODate("2014-10-31T16:00:00Z") }  
  243. >   

你可能感兴趣的:(MongoDB)