Native MongoDB中的自动增量

时间:2014-04-06 12:46:20

标签: node.js 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()等,但仍无法成功移植它。

有没有人真的设法让这个功能发生了?我正在寻找真正的答案,我知道很多人可能也会感兴趣。

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

不,这不是我唯一的身份证,我还在使用ObjectID,我只需要一个序列号,对每条记录都是唯一的。

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

感谢

1 个答案:

答案 0 :(得分:1)

试试这个:

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);
            }
        });
    });

}