是的,你可能会在这里想到“这是一个重复的问题”,它可能确实如此,但是在寻找问题的答案大约几个小时之后,我找不到能够解决我的问题的单一答案,老实说大多数人都问过同样的事情。所以我会尝试提出一个不同的问题,所以在这里。
有没有人真正设法将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,我只需要一个序列号,对每条记录都是唯一的。
如果您已经完成,请分享!你会为我节省时间! :)
感谢
答案 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);
}
});
});
}