【问题标题】:Duplicate key error while using _id from another collection使用另一个集合中的 _id 时出现重复键错误
【发布时间】:2020-12-22 22:01:22
【问题描述】:

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

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

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

MongoError:E11000 重复键错误集合:ratchat.rooms 索引:users_1 重复键:
{用户:“5fe08d452f34530e641d8f8c”}

使用调试器检查后,我发现只有当我使用另一个房间的“用户”数组中已使用的 user._id 时才会出现错误。
我能想到的唯一可能导致此问题的是 Room 架构,
也许在阅读文档时我错过了一些东西......

起初我的 Room 架构是这样的:

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

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

  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);

到目前为止还没有运气......

【问题讨论】:

  • 您有 2 个文档(房间),一开始都是空的。您将相同的用户添加到两者,然后重复 a:["user":<id>]。它不能是唯一索引。 (我猜你在users 字段中创建了一个唯一索引)。我会从房间集合中的用户字段中删除唯一索引。
  • @Minsky 我在房间集合的用户字段中尝试了 "unique: false",删除了所有现有文档并尝试创建 2 个类似的房间 - 同样的错误。整个房间集合完全是空的。创建房间的函数(在房间控制器中)使用已登录的用户和 req.body 中的用户创建它。所以没有房间是空的。

标签: javascript node.js mongodb mongoose mongoose-schema


【解决方案1】:

{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 });

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

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

【讨论】:

    猜你喜欢
    • 2021-07-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-11
    • 2017-09-28
    • 1970-01-01
    • 1970-01-01
    • 2014-03-19
    相关资源
    最近更新 更多