繁体   English   中英

本机MongoDB中的自动增量

[英]Auto-increment in Native MongoDB

是的,您可能会想到“这是一个重复的问题”,的确是这样,但是在寻找问题的答案大约几个小时之后,我却找不到一个可以真正解决我的问题的答案,并且老实说,大多数问同一件事的人。 因此,我将尝试提出一个不同的问题,所以就到这里了。

有人真的设法将mongo doco中描述的以下功能移植到mongodb本机驱动程序中吗? 我正在使用nodejs,并且很难将其移植到本机驱动程序。

function insertDocument(doc, targetCollection) {

    while (1) {

        var cursor = targetCollection.find( {}, { _id: 1 } ).sort( { _id: -1 } ).limit(1);

        var seq = cursor.hasNext() ? cursor.next()._id + 1 : 1;

        doc._id = seq;

        targetCollection.insert(doc);

        var err = db.getLastErrorObj();

        if( err && err.code ) {
            if( err.code == 11000 /* dup key */ )
                continue;
            else
                print( "unexpected error inserting data: " + tojson( err ) );
        }

        break;
    }
}

我读到有关nextObject(),toArray(),forEach()等的信息,但仍无法成功移植。

有没有人真的设法通过此功能实现了这一目标? 我正在寻找真正的答案,我知道很多人也可能对此感兴趣。

我特别要问这个问题,因为根据我的理解,这是最“安全”的一个,因为其他建议在尝试同时插入多个文档时存在一些缺陷。

不,这不是我的唯一ID,我仍在使用ObjectID,我只需要一个序列号,该序列号对于每条记录都是唯一的。

如果您已完成,请分享!!! 您将为我节省时间! :)

谢谢

尝试这个:

function insertDocument(doc, collection) {
    collection.find({}, {
        limit: 1,
        fields: {
            _id: 1
        },
        sort: {
            _id: -1
        }
    }).toArray(function (err, docs) {
        var _next = docs.length ? docs[0]._id + 1 : 1;
        doc._id = _next;
        collection.insert(doc, function (err, result) {
            if (err && err.message.indexOf('11000') > -1) {
                //try again
                insertDocument(doc, collection);
            }
        });
    });

}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM