【问题标题】:How to call a mongodb function using monk/node.js?如何使用mongodb/node.js 调用mongodb 函数?
【发布时间】:2015-02-20 21:20:17
【问题描述】:

想要实现这个:

http://docs.mongodb.org/manual/tutorial/create-an-auto-incrementing-field/#auto-increment-counters-collection

为一些事情提供序列计数器。

我已将函数存储在我的数据库中,但我无法在没有错误的情况下调用它:

var model_id = db.eval('getNextSequence("model")');

返回:

对象#没有方法'getNextSequence'

是不是因为monk不支持通过eval使用db函数?

【问题讨论】:

  • 如果这有帮助,这也不起作用:models.insert ({'model_id': getNextSequence("model"),'user_id':user_id, 'property': property, ' form': form, 'series': series}, {}, function(e,doc){ res.json(doc); });

标签: javascript node.js mongodb monk


【解决方案1】:

getNextSequence 方法是您的应用程序代码的一部分,并在您的应用程序中运行,而不是在数据库中。在 mongodb 文档的示例中,该应用程序是 mongo shell,它基本上是一个简单的 javascript 包装器,您可以在其中轻松声明自己的方法。

无论如何,实现可靠、无间隙的计数器并非易事,除非绝对必要,否则应避免使用:

  1. 如果由于客户端崩溃、网络分区等原因导致后续插入失败,则在插入之前增加计数器会导致间隙。
  2. 在插入之后增加计数器需要optimistic insert loop(但不需要显式计数器,如链接中所示)。这更可靠,但对于并发写入者来说效率低下,因为它执行大量查询并且更新失败。

简而言之,如果您正在使用此类计数器,例如在单个帐户/租户中,其中帐户的用户是人类。如果您的帐户很大或者您有 API 客户端,那么事情就会变得一团糟,因为它们可能会在几秒钟内爆裂并执行 10,000 次插入,从而导致大量冲突。

永远不要使用增量键作为主键。

【讨论】:

  • 谢谢。似乎是一个很糟糕的主意!我正在尝试一种不同的方法,使用本机 mongo _ids 和一个单独的集合来存储相关对象的旧版本。可能更快,当然更安全,并且更容易使用。
猜你喜欢
  • 1970-01-01
  • 2015-11-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-22
  • 1970-01-01
相关资源
最近更新 更多