使用来自另一个 collection 的 _id 时出现重复键错误

Duplicate key error while using _id from another collection

到目前为止我有 2 collection。
第一个是 'Users' collection (效果很好),另一个是 'Rooms' collection(都是为聊天应用程序创建的)。

我希望每个房间都有一个“用户”数组,其中将包含user._id该房间中的每个用户
这意味着我应该能够在每个房间中放置相同的 user._id(来自用户 collection),对吧?

在“用户”数组中使用 2 user._id 成功创建房间后,
我试着用我在第一个房间里用过的 user._id 制作另一个。
然后我得到这个错误:

MongoError: E11000 duplicate key error collection: ratchat.rooms index: users_1 dup key:
{ users: "5fe08d452f34530e641d8f8c" }

在使用调试器检查后,我发现仅当我使用已在另一个房间的“用户”数组中使用的 user._id 时才会发生错误。
我唯一能想到的可能导致这个问题的是房间模式,
也许我在阅读文档时遗漏了什么...

起初我的房间架构如下所示:

  const roomSchema = new mongoose.Schema({
  users: [String],
  hasLeft: [String],
  isGroup: { type: Boolean, default: false },
  },
});
const Room = mongoose.model("Room", roomSchema);

然后我想也许 mongoDB 需要知道用户数组中的 ObjectId 只是对另一个 collection:

的引用
  const roomSchema = new mongoose.Schema({
  users: [{ type: mongoose.Schema.Types.ObjectId, ref: "User" }],
  hasLeft: [String],
  isGroup: { type: Boolean, default: false },
  },
});
const Room = mongoose.model("Room", roomSchema);

到目前为止运气不好...

{autoIndex: false}

经过研究,我找到了这个错误的原因:
mongoose 自动创建索引,
这不仅是一个重复的错误问题,而且会在以后的生产中对性能产生重大影响。

根据 mongoose docs,您可以通过将架构的 autoIndex 选项设置为 false 轻松禁用此行为,或者通过将选项 autoIndex 设置为 false 在全局连接上禁用此行为。

  mongoose.connect('mongodb://user:pass@localhost:port/database', { autoIndex: false });
  // or
  mongoose.createConnection('mongodb://user:pass@localhost:port/database', { autoIndex: false });
  // or
  animalSchema.set('autoIndex', false);
  // or
  new Schema({..}, { autoIndex: false });

在重试之前不要忘记删除整个集合

因为集合已经编入索引,完全清空它是行不通的。
您必须删除整个集合。