Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 本机MongoDB中的自动增量_Node.js_Mongodb - Fatal编程技术网

Node.js 本机MongoDB中的自动增量

Node.js 本机MongoDB中的自动增量,node.js,mongodb,Node.js,Mongodb,是的,你可能会想到“这是一个相当重复的问题”,这可能是真的,但在花了大约几个小时寻找问题的答案后,我没有找到一个真正解决我问题的答案,老实说,大多数问同样问题的人。所以我要试着提出一个不同的问题,现在开始 是否有人真的将mongo doco中描述的功能移植到mongodb本机驱动程序中?我正在使用nodejs,我很难将它移植到它的本机驱动程序 function insertDocument(doc, targetCollection) { while (1) { va

是的,你可能会想到“这是一个相当重复的问题”,这可能是真的,但在花了大约几个小时寻找问题的答案后,我没有找到一个真正解决我问题的答案,老实说,大多数问同样问题的人。所以我要试着提出一个不同的问题,现在开始

是否有人真的将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);
            }
        });
    });

}

您可以使用这样的代码来获得唯一的顺序ID(但请注意,正如本文要点中的注释所示,这会产生一些后果),因此我询问了上述代码的原因。正如我所说,从所有选项中,上面的一个似乎是最“安全”的。如果我可以这么说的话,这正是我想要的。谢谢@levi!:P