由于生成重复密钥,插入文档失败(用例:浏览器刷新时登录和注销插入)

时间:2015-03-05 01:38:58

标签: node.js mongodb

以下代码记录有关用户连接和用户断开连接的文档。如果用户刷新页面,则断开连接,然后连接会很快发生,并且会在断开连接处生成相同的目标。 连接

function handleSocket(socket) {
socket.notify_user_state_data.state = "CONNECTED";
notify_user_state_collection.insert(
    socket.notify_user_state_data, function(err) {});

socket.on('disconnect', function () {
    socket.notify_user_state_data.state = 'DISCONNECTED';
    notify_user_state_collection.insert(
    socket.notify_user_state_data, function(err) {});   
}

这可能是由于文档http://docs.mongodb.org/manual/reference/object-id/#ObjectIDs-BSONObjectIDSpecification

中提到的警告造成的

ObjectId值的顺序与生成时间之间的关系在一秒内不严格

如何解决这个问题?

1 个答案:

答案 0 :(得分:0)

collections.insert(data_object)方法首次在data_object中添加_id字段。因此,当第二次调用collections.insert(data_object)时,它不会为现有的_id生成任何值。

获取要插入的对象的副本可以解决问题,如以下答案所示。

function handleSocket(socket) {
socket.notify_user_state_data.state = "CONNECTED";
socket.notify_user_state_data = data;
var data_copy = {};
for (var i in data) {
    data_copy[i] = data[i];
}

notify_user_state_collection.insert(
    data_copy, function(err) {}); // after insert the data_copy will have a new _id property added to it.

socket.on('disconnect', function () {
    socket.notify_user_state_data.state = 'DISCONNECTED';
    notify_user_state_collection.insert(
    socket.notify_user_state_data, function(err) {});   
}