以下代码记录有关用户连接和用户断开连接的文档。如果用户刷新页面,则断开连接,然后连接会很快发生,并且会在断开连接处生成相同的目标。 连接
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值的顺序与生成时间之间的关系在一秒内不严格
如何解决这个问题?
答案 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) {});
}