【问题标题】:MongoDB race conditions or concurency issuesMongoDB 竞争条件或并发问题
【发布时间】:2016-09-03 10:25:00
【问题描述】:

我在基于 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 个用户 guid。我认为save 可以作为现有文档的update,但它如何更新数组?如果$set,为什么我有这么3个用户房间。有什么想法怎么可能?

【问题讨论】:

    标签: node.js mongodb ecmascript-6


    【解决方案1】:

    save() 如果文档不存在,则表现为插入。您必须将 update() 与 {upsert: false}

    一起使用
    • 一些更新数组的资源:@​​987654321@, array Operator
    • 在文档中嵌套数组的简单教程,here
    • 处理多个嵌套数组的高级示例,here

    【讨论】:

      猜你喜欢
      • 2013-12-31
      • 2023-01-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-01
      • 1970-01-01
      • 2019-03-21
      • 2016-11-09
      相关资源
      最近更新 更多