如何在Mongoose Schema中实现`to`与`from`属性组合唯一性?
解决Mongoose好友请求重复提交的唯一索引问题
你设置的复合唯一索引{ to: 1, from: 1 }逻辑是对的,但报错提示的是from_1单字段索引重复,说明你的MongoDB集合里还存在之前创建的from字段单唯一索引——哪怕代码里注释掉了unique: true,数据库里的旧索引不会自动删除。
问题排查与解决步骤:
- 查看集合现有索引
打开MongoDB Shell,执行命令查看friendrequests集合的所有索引:
db.friendrequests.getIndexes()
执行后会看到包含from_1的单字段唯一索引,这就是报错的根源。
- 删除多余的单字段索引
删除from字段的单唯一索引:
db.friendrequests.dropIndex("from_1")
如果之前to字段也设置过单唯一索引,同样需要删除:
db.friendrequests.dropIndex("to_1")
- 验证复合索引状态
再次执行db.friendrequests.getIndexes(),确认只有to_1_from_1这个复合唯一索引存在。此时同一发送者向同一接收者提交重复请求会触发复合索引的唯一性校验,符合你的需求。
补充说明
如果集合中已经存在重复的from字段记录(但to不同),删除索引前需要先清理这些数据,或根据业务逻辑保留需要的记录,避免出现不符合预期的数据。
附相关代码与信息:
Mongoose Schema代码
import { model, Schema, Document } from 'mongoose'; import { FriendRequestInterface } from '@interfaces/friendrequest.interface'; import { FriendRequestStatus } from '@/enums/enumFriendRequest'; const friendRequestSchema: Schema = new Schema({ to: { type: String, required: true, // unique: true, }, from: { type: String, required: true, // unique: true, }, message: { type: String, required: false, }, status: { type: String, enum: FriendRequestStatus, required: true, }, }); friendRequestSchema.index({ to: 1, from: 1 }, { unique: true }); const friendRequestModel = model<FriendRequestInterface & Document>('FriendRequest', friendRequestSchema); export default friendRequestModel;
请求数据
{ "to": "636acf77378903f78b388339", "from": "636acf83378903f78b38833f", "message": "Hello, I want to be your friend.", "status": "pending" }
报错信息
{ "message": "E11000 duplicate key error collection: db_dev.friendrequests index: from_1 dup key: { from: \"636acf83378903f78b38833f\" }" }
内容的提问来源于stack exchange,提问作者Daly
相关产品推荐
相关产品推荐

