使用MongoDB中的shell脚本安装函数

时间:2015-01-12 23:20:06

标签: bash mongodb shell

我有一个虚拟机(CentOS),它有一个完全脚本化的环境,包括一个MongoDB。我需要在我的集合上自动递增id列,并遵循mongoDB文档中的指令使用计数器集合和函数来更新该集合。

详情请见:http://docs.mongodb.org/manual/tutorial/create-an-auto-incrementing-field/

我可以在mongo shell中使用这个,所以我的插入调用函数并递增序列,我现在想要编写脚本作为VM配置的一部分,但我不知道如何处理函数部分

我使用以下命令在bash脚本中创建了计数器集合:

mongo audit --eval "db.counters.insert({_id: 'sequence',seq: 0})"

接下来,我将我的函数添加到system.js集合中:

mongo audit --eval "db.getCollection('system.js').save({_id:'getNextSequence', value:'function getNextSequence(name) { var ret = db.counters.findAndModify( { query: { _id: name }, update: { $inc: { seq: 1 } }, new: true }); return ret.seq; }'})"

现在我尝试加载保存的脚本:

mongo audit --eval "db.loadServerScripts()"

这给了我一个错误:

SyntaxError: Unexpected token 

我是以错误的方式来做这件事的吗?他们是另一种安装函数的方法,我可以在每个插入到我的集合中调用它吗?

我的插入将从运行在Sinatra Web服务中的一些JRuby代码执行,看起来类似于:

db.users.insert(
   {
     _id: getNextSequence("sequence"),
     name: "Bob Builder."
   }
)

感谢您的帮助。

根据要求,这是我用来启动mongo并在我的VM配置中创建集合的脚本:

#start mongo service
sudo service mongod start

#set config to restart service on reboot
sudo chkconfig mongod on

#create DB collections and indexes
mongo --eval "db.getSiblingDB('audit').errors.ensureIndex({title_number:1})"
mongo --eval "db.getSiblingDB('audit').minteds.ensureIndex({title_number:1})"

到目前为止一直运行良好,但现在我需要一个自动递增ID。

我已按照上面链接中的说明操作,并通过交互式shell手动添加了该功能,并在我的插件上调用了该功能,如上面的用户集合所示。在这一点上,我开始查看我已完成的脚本,并设法创建了计数器集合,这将保留序列计数

mongo --eval "db.getSiblingDB('audit').counters.insert({_id: 'sequence',seq: 0})"

然后我尝试使用

向服务器安装功能(但可能错误地通过您的回复判断)
mongo audit --eval "db.getCollection('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; }'})"

使用Robomongo我可以看到函数在那里但是当我尝试插入时它似乎不起作用。基本上我需要编写上面链接中显示的进程的脚本,但是如果不手动执行它就无法安装/运行该函数。我想我错过了一些基本的东西,但我看不出它是什么,所以你的评论非常感谢。

1 个答案:

答案 0 :(得分:0)

无法安装在每个插入服务器上运行的函数。如果您需要这样的功能,则需要在代码中的每个插入处调用它。你的javascript中有一些拼写错误导致了意外的令牌错误,但这是无关紧要的,因为你不想继续使用当前的方法。

要设置自动增量,请在JRuby代码中定义getNextSequence函数,然后为每个插入调用它。执行插入的任何其他客户端也需要getNextSequence函数来插入/ upsert之前调用。您无法为服务器端的每个插件设置运行的功能; 每个客户必须注意使用getNextSequence函数执行正确的插入并维护自动增量_id