MongoDB竞争条件或确定性问题

时间:2016-09-03 10:25:01

标签: node.js mongodb ecmascript-6

我在基于NodeJS和MongoDB的聊天应用程序中有以下代码来更改房间的管理员:

export function setAdmin(room, user) {
  const userGuid = getGuid(user);
  if (room.users && room.users.length) {
    // filter current and new
    room.users = room.users.filter(guid => 
      guid !== room.adminGuid && guid !== userGuid
    );
  } else {
    room.users = [];
  }

  room.users.push(userGuid);
  room.adminGuid = userGuid;

  return roomsCollection.save(room, { w: 1 });
}

每个房间只有2个用户:管理员和客户。 要更新几个房间:

  const rooms = await roomsCollection.find({ adminGuid: currentAdminGuid  }).toArray();
  for (const room of rooms) {
    await setAdmin(room, newAdminUser);
  }

我在应用程序的高负载下遇到了一些问题。他们在索引的帮助下解决了。

但之后,使用MongoDB转储我发现我在room.users数组中有3个用户guids的房间。我认为save对于现有文档可以作为update,但它如何更新数组?如果$set,为什么我有这样的3个用户房间。有什么想法可以吗?

1 个答案:

答案 0 :(得分:0)

如果文档不存在,

save()表现为插入。您必须将update()与{upsert:false}

一起使用