Mongoose拍卖系统子文档数组出价金额唯一约束不生效问题求助
问题原因
- MongoDB的唯一索引是集合级别的全局约束,你在
bidSchema的amount字段设置的唯一索引,会要求整个数据库所有拍卖的所有出价金额都唯一,完全不符合你的业务需求,而且该约束也不会对同一个父文档内的子数组字段生效,所以你之前的写法无法限制同一场拍卖内的出价金额重复。 - 你使用的
$push操作符本身没有去重逻辑,只要查询命中就会插入新的子文档,自然会出现重复金额。
解决方案
修改查询条件,增加「当前拍卖的bids数组中不存在待插入的出价金额」的判断,只有条件全部满足时才执行插入操作,具体实现如下:
const query = { 'tokenId': tokenId, // 新增条件:同拍卖下没有相同的出价金额 'bids.amount': { $ne: bidBody.amount } }; const update = { $push: { bids: bidBody } }; // 可选配置new: true返回更新后的文档,方便后续逻辑判断 Auction.findOneAndUpdate(query, update, { new: true }, function (err, data) { if (err) { console.log(err); return; } // 如果返回结果为空,说明存在重复金额,插入失败 if (!data) { console.log('该出价金额已存在,无法重复出价'); } });
额外优化建议
- 请删除
bidSchema中amount字段的唯一索引配置,该索引不符合业务需求,反而会导致不同拍卖之间相同的出价金额无法插入,引发业务错误。 - 可以给
bids.amount字段加普通查询索引,优化上述查询的执行速度。
内容的提问来源于stack exchange,提问作者zanzoken
相关产品推荐
相关产品推荐

