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

时间:2011-07-27 16:25:39

标签: mongodb erlang

我正在尝试官方的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().
  1. 这是正确的方法吗?每次我完成数据库操作,Conn似乎都死了。或者我应该保留Conn而不是断开它以便下次重复使用它?没有全局变量可以保留Conn所以我能想出的唯一方法是使用类似gen_server的内容并在其状态中保留Conn以便重复使用。这是正确的方法吗?

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

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

  5. 非常感谢!

1 个答案:

答案 0 :(得分: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。