mongodb 自定义函数—自增长id
2015-10-05 11:35
351 查看
最近在做mongodb的备份工作,需要做一些自定义函数以方便备份的相关运作。在mongodb中,可以把一些自定义函数放入数据库中以方便今后的使用。
下面以自增id函数为例:
在进行数据设计时,不可避免的需要用到自增id,但是mongodb中无法像mysql中那样,提供专门的自增id索引。因此需要人为对id进行自增操作。在官网的mongodb手册上是这么实现的:
首先需要建立一个表结构,用于存储你的id信息:
然后定义一个函数,每次调用实现id++功能
上面的函数,主要用到了findAndModify这个系统函数,此系统函数其实就是实现了update的quary语句。
3. 接下来就可以在其他数据库中进行应用了
我们来查看一下结果:
看来是成功了,但是,按照上面的方法,有一个问题。就是每次退出mongo重进之后,我的getNextSequence都无法正常使用了,会出现下面所示的错误:
ReferenceError: getNextSequence is not defined
引起这个的原因是,本实例中定义的函数没有保存,在mongo实例退出后会自动清零。所以需要对我们辛辛苦苦定义的函数进行保存,要不然岂不是白干了。
那好我们就保存在一个表中,这样总不至于把函数搞丢了吧。保存的方式也有两种,一种是插入,如下所示。
还有一种保存方法,在官网上有提到,就是用db.collection.save()函数进行保存,其实都是一样的。
可能有人会问,为什么是system.js这个表,而不是其他的,因为这个表是专门用来保存js函数的。如果你定义完函数退出mongo实例,会发现还是无法使用函数getNextSequence,这是因为虽然你定义了函数,但是没有把函数引入进来,也就是说每次重新进入mongo的实例后需要把相应的js函数重新导入一遍。通过,db.loadServerScripts();把system.js中的函数,引入到mongo实例。这也是保存到system.js中原因,mongodb数据库提供了很好的库函数进行函数引用。
还有一种引入方式如下:
db.eval(‘getNextSequence(“userid”)’);
可能大家感觉上面的方式很麻烦,但是不同的方式其应用场景不太相同。大家在进行编程时慢慢体会吧。举个bash中完整应用的例子
下面以自增id函数为例:
在进行数据设计时,不可避免的需要用到自增id,但是mongodb中无法像mysql中那样,提供专门的自增id索引。因此需要人为对id进行自增操作。在官网的mongodb手册上是这么实现的:
首先需要建立一个表结构,用于存储你的id信息:
db.counters.insert( { _id: "userid", seq: 0 } )
然后定义一个函数,每次调用实现id++功能
function getNextSequence(name) { var ret = db.counters.findAndModify( { query: { _id: name }, update: { $inc: { seq: 1 } }, new: true } ); return ret.seq; }
上面的函数,主要用到了findAndModify这个系统函数,此系统函数其实就是实现了update的quary语句。
3. 接下来就可以在其他数据库中进行应用了
b.users.insert( { _id: getNextSequence("userid"), name: "Sarah C." } ) db.users.insert( { _id: getNextSequence("userid"), name: "Bob D." } )
我们来查看一下结果:
db.users.find(); {_id : 1, name : "Sarah C."} {_id : 2, name : "Bob D."}
看来是成功了,但是,按照上面的方法,有一个问题。就是每次退出mongo重进之后,我的getNextSequence都无法正常使用了,会出现下面所示的错误:
ReferenceError: getNextSequence is not defined
引起这个的原因是,本实例中定义的函数没有保存,在mongo实例退出后会自动清零。所以需要对我们辛辛苦苦定义的函数进行保存,要不然岂不是白干了。
那好我们就保存在一个表中,这样总不至于把函数搞丢了吧。保存的方式也有两种,一种是插入,如下所示。
db.system.js.insert( {_id:"getNextSequence",value:function getNextSequence(name) { var ret = db.counters.findAndModify( { query: { _id: name }, update: { $inc: { seq: 1 } }, new: true } ); return ret.seq; } });
还有一种保存方法,在官网上有提到,就是用db.collection.save()函数进行保存,其实都是一样的。
db.system.js.save({ _id : "myAddFunction" , value : function (name){ var ret = db.counters.findAndModify( { query: { _id: name }, update: { $inc: { seq: 1 } }, new: true } ); return ret.seq; } });
可能有人会问,为什么是system.js这个表,而不是其他的,因为这个表是专门用来保存js函数的。如果你定义完函数退出mongo实例,会发现还是无法使用函数getNextSequence,这是因为虽然你定义了函数,但是没有把函数引入进来,也就是说每次重新进入mongo的实例后需要把相应的js函数重新导入一遍。通过,db.loadServerScripts();把system.js中的函数,引入到mongo实例。这也是保存到system.js中原因,mongodb数据库提供了很好的库函数进行函数引用。
还有一种引入方式如下:
db.eval(‘getNextSequence(“userid”)’);
可能大家感觉上面的方式很麻烦,但是不同的方式其应用场景不太相同。大家在进行编程时慢慢体会吧。举个bash中完整应用的例子
#/home/test/mongodb/bin/mongo --port 20017 <<EOF use mgdb db.loadServerScripts() db.mgtest.insert({ id:getNextSequence("userid"), name:"daxia" }) exit EOF
相关文章推荐
- 分享微信开发Html5轻游戏中的几个坑
- 如何在 Fedora 上安装 MongoDB 服务器
- PHP添加yaf xhprof mongodb 同理
- mongodb安装
- 如何在 Ubuntu 上安装 MongoDB
- 注册表的组织结构
- Mootools 1.2教程 函数
- autoit InputBox 函数
- 文件遍历排序函数
- Oracle 函数大全[字符串函数,数学函数,日期函数]第1/4页
- ASP下经常用的字符串等函数参考资料
- PostgreSQL教程(五):函数和操作符详解(1)
- DOS批处理 函数定义与用法
- asp Chr 函数 数字转字母的方法
- Lua中的函数精讲笔记
- Lua中的闭合函数、非全局函数与函数的尾调用详解
- Lua中调用C++函数示例
- Lua实现split函数
- Lua常用时间函数使用实例
- Lua函数与字符串处理简明总结