使用计数器集合在node-mongodb-native中自动增加

时间:2013-08-22 05:16:12

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

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

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

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

有什么想法吗?

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

我已经用一些嵌套调用实现了这个(以及其他东西),如下所示。 doc来自客户端JSON.parse。我必须将此doc返回给客户,其中_id(按db.coll.save排序)和typeserial(目前按db.coll.count排序,如下所示)

 ///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

2 个答案:

答案 0 :(得分:1)

我基本上打算将我的评论作为答案:

  

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

要解释更多信息,当您使用findAndModify$inc并从计数器集合返回时,_id应该是唯一的,该脚本的运行以及后续插入的文献。基本上这种方法没有竞争条件。

这确实意味着您将需要某种类型的父函数,例如insertWithAI,它将使用findAndModify进行第一次回调来链接后一个插入回调但在一天结束时您应该只需要两个回调。

答案 1 :(得分:0)

我在async的帮助下使用“乐观循环”实现了自动增量,同时工作正常:

Creating incrementing numbers with mongoDB