MongoDB固定集合的使用(基于Ruby)-记录用户日志行为

2017-08-17 20:23:28来源:CSDN作者:wanght89人点击

分享

  在使用2.3.3版本的Ruby操作3.4版本的MongoDB中,如何通过Ruby在MongoDB中创建固定和使用集合,用于记录用户的日志行为。

  MongoDB中的固定集合原本是针对高性能日志场景设计的。它们与标准集合的区别在于其大小是固定的。也就是说,一旦固定集合到达容量上限,后续的插入会覆盖集合中最先插入的文档。在只有最近的数据才有价值的情况下,这种设计免除了用户手工清理集合的烦恼。

  以记录站点用户的行为,如查看产品、添加购物车、结账和购买。下面的脚本用来模拟向固定集合记录这些用户行为的日志功能。

require 'mongo'VIEW_PRODUCT =0ADD_TO_CART =1024CHECKOUT =2PURCHASE =3con=Mongo::Client.new(['127.0.0.1:27017'],:database=>'test')
#删除test数据库db=con.databasedb.drop
#创建固定集合logInfologInfo=con[:logInfo,:capped=>true,:size=>1024]logInfo.create
#循环向固定集合logInfo中插入文档20.times do |n| doc={ :username=>"Kbanker", :action_code=>rand(4), :time=>Time.now.utc, :n=>n} logInfo.insert_one(doc)end 

   该段ruby代码执行完毕后,在MongoDB Shell端首先执行shwo dbs,发现test数据库已存在。使用use指令,use test进入test数据库,执行show collections,查询该数据库下已有的集合。找到logInfo集合。此处可以验证创建的是否是固定集合,执行db.logInfo.isCapped(),发现执行结果为true,则确认创建的集合为固定集合,结果如下;


  然后 执行db.logInfo.count(),执行结果如下图。


   发现循环插入了20个文档,但集合中却只有12个文档。为找到出现该种现象的原因。执行db.logInfo.find()指令,结果如下:


  发现集合中现有文档的n是从8-19。发现后面插入的文档覆盖了原有的文档。这就是MongoDB中固定集合的使用方式。在固定集合的使用中,我们还需要注意固定集合和标准集合之间的几个不同点。

  1. 固定集合默认不回位_id创建索引,这是为了优化性能,没有索引,插入会更快。但是在3.4版本中,MongoDB默认为id创建了索引,通过db.logInfo.getIndexes()获取当前集合的索引。结果如下图所示。同样MongoDB还提供了一个特殊的顺序操作符,按自然插入顺序(文档保存在磁盘上的顺序)返回集合的文档。之前的查询是正向输出结果;如果要逆向输出,使用$natural排序操作符:

db.logInfo.find().sort({"$natural":-1})

倒序排列的执行结果如下:


  2. 除了按自然顺序排列文档,并放弃索引(当前版本已增加了索引)。固定集合还限制了CRUD操作。比如:不能从固定集合中删除文档,也不能执行任何会增加文档大小的更新操作。我们尝试在固定集合上执行删除操作

db.logInfo.remove({'n':'8'})
   执行结果如下图,报错信息为:不能从固定集合中删除文档信息

db.logInfo.update({'n':8},{$set:{"username":"KbankerNew"}})

新名字的字符数大于了原名字的字符数,执行结果报错


如大小相等呢?

db.logInfo.update({'n':8},{$set:{"username":"Kbanee"}})

大小相等,执行更新操作成功。

若小于呢?猜测是可以执行成功的:

db.logInfo.update({'n':8},{$set:{'username':'Kbank'}})

根据结果判断,小于也是不能执行成功的。

到此,关于固定集合的使用方式和操作方法介绍结束。大家可以结合这个示例继续深入开发。

  在MongoDB中,存在一类特殊的集合。MongoDB内部对集合的使用方式可以体现它的部分设计思想。system.namespaces与system.indexes就属于这些特殊系统集合。前者用于查询到当前数据库中定义的所有命名空间;后者存储了当前数据库的所有索引定义。




 

最新文章

123

最新摄影

微信扫一扫

第七城市微信公众平台