【发布时间】: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