【问题标题】:auto increment in node-mongodb-native using counters collection使用计数器集合在 node-mongodb-native 中自动递增
【发布时间】:2013-08-24 16:40:19
【问题描述】:

是否有任何方法可以实现 counters collection 的描述,如使用 node-mongodb-native 的文档中所述?

我试图通过嵌套超过 9000 个回调来避免这样做(恕我直言,这听起来不整洁且不优雅),但编写此本机驱动程序的好人拒绝实现同步/阻塞调用。

本机驱动程序是否提供某种方式来调用用户定义的函数并在查询期间使用它们的返回值?或者是否有另一种提取顺序计数的方法......可能仅来自ObjectID()

有什么想法吗?

编辑:
这不适用于 _id 字段(由 db.coll.save(x) 处理)
我在集合中有不同类型的文档。如果您知道我的意思,这些中的每一个都需要自己的“类型序列”或“类型序列”。

我已经用几个嵌套调用实现了这个(加上其他东西),如下所示。 doc 是来自客户端的JSON.parse。我必须使用_id(按db.coll.save 排序)和typeserial(当前按db.coll.count 排序,如下所示)将此doc 返回给客户端

 ///more nesting Async calls above. 
 db.collection('dox').count( { "type" : doc.type } ,
    function( err , count )
    {
        ///{some err checking code here}
        doc.typeseq = (1+count);
        db.collection('dox').save( doc ,
            function( err , doc )
            {
                ///{more code here}
                ///Finally return JSON.stringified doc with new info/members to client-side
            }
        );
    }
 );

我只是想知道是否有更优雅、反异步的方式来获取我的doc.typeserial

【问题讨论】:

  • 您只需要两个回调,一个用于获取预定义的原子检索 _id,另一个用于实际插入您的文档。一旦你有你的自动增量_id,它应该总是以这种方式插入的文档是唯一的

标签: node.js mongodb node-mongodb-native


【解决方案1】:

我基本上会把我的评论作为答案:

您只需要两个回调,一个用于获取预定义的原子检索 _id,另一个用于实际插入您的文档。一旦你有你的自动增量_id,它应该总是以这种方式插入的文档是唯一的

为了解释更多,当您使用 findAndModify$inc 并从 counters 集合返回时,_id 应该是唯一的,该脚本的运行以及随之而来的文档的插入。这种方法基本上不会有竞争条件。

这确实意味着您将需要某种父函数,例如insertWithAI,它将执行使用findAndModify 的第一个回调来链接插入的后一个回调,但最终您应该只需要两个回调。

【讨论】:

  • 我目前正在使用db.coll.count 来获取我的序列,但在异步调用中。检查我上面的编辑以进一步澄清(我对歧义的看法不好)。
  • @Moje 啊,这让它变得更复杂了,但是,这些不是 $inc 字段,所以也许有办法调用getSequentialId() 函数hmmm
  • 触摸!现在是棘手的部分 -> 使用 getSequentialId(X) 函数实现持久计数器集合...优雅。
  • @Moje 我确实有一个想法,但它并没有通过异步实现,我会继续思考
  • 有人找到解决此问题的方法吗?
【解决方案2】:

我在异步的帮助下使用“乐观循环”实现了自动增量,而效果很好:

Creating incrementing numbers with mongoDB

【讨论】:

    猜你喜欢
    • 2017-01-11
    • 2011-07-23
    • 2019-11-18
    • 1970-01-01
    • 2015-11-10
    • 2016-01-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多