使用erlang mongodb驱动程序进行数据库操作的正确方法是什么?

Yan*_*Yan 1 erlang mongodb

我正在尝试官方的mongodb erlang驱动程序.我阅读了文档,还有一些我无法理解的东西.希望有人能告诉我使用它的正确方法是什么:

每次我做出一个动作,我都会写下如下内容:

{ok, Conn} = mongo:connect ({localhost, 27017}).
mongo:do (safe, master, Conn, test, fun() ->
    mongo:save (foo, {'_id', 1, bbb,22, y,2}),
    mongo:save (foo, {'_id', 4, bbb,22, y,2}) end).
mongo:disconnect().
Run Code Online (Sandbox Code Playgroud)
  1. 这是正确的方法吗?每次我完成数据库操作,Conn似乎都死了.或者我应该保留Conn而不是断开它以便下次重复使用它?没有全局变量可以保留,Conn所以我能想出的唯一方法是使用类似的东西gen_server并保持Conn其状态以便重用.这是正确的方法吗?

  2. 我也看到有一种connect_factory方法.但我无法弄清楚处理它的正确方法.是connect_factory一种比连接处理大量数据库操作更好的方法吗?以及如何Conn使用connect_factory

  3. 这是一个与mongodb无关的问题.我想在访问时给每个用户一个唯一的号码.所以我在db中保存了一个计数器,当用户访问时,计数器加1并作为唯一编号返回给用户.但我总是担心两个用户同时阅读db会得到相同的数字.如何使用mongodb将一个独特的计数器增加1?

非常感谢!

Ton*_*nan 5

  1. 如果您的操作有错误,Conn可能会死亡,否则它应该是可重复使用的.注意,mongo:在出错时返回{failure,X}.如果要重用Conn,请不要断开连接.BTW,disconnect将Conn作为一个参数.如果您想将Conn保留在全局var中,请参阅Erlang文档以了解执行此操作的方法(例如,ets table,gen_server等).另外,请查看此驱动程序中的mvar模块,以获取包含值的简单gen_server.
  2. connect_factory用于维护可重用的连接池.阅读http://github.com/TonyGen/mongodb-erlang上的教程.在底部显示了如何将connect_factory与resource_pool一起使用.
  3. 您可以使用MongoDB以原子方式递增.请参阅http://www.mongodb.org/display/DOCS/Atomic+Operations,特别是findAndModify.