我已经为产品创建了更新路线。有些字段必须是唯一的。
当创建一个产品时,我会像这样检查
const emailExists = await Foodlancer.findOne({ email: values.email });
if (emailExists) {
return res.status(400).json({ error: 'Email already used' });
}
但我不确定在更新产品时如何检查是否已经使用电子邮件。
如果我使用上面的代码,它将为我们正在更新的同一个对象返回true。
有没有排除对象的方法?我查看了$ne
和$nin
,但不确定在这种情况下如何使用它们。
有什么建议吗?
首先,您可以创建一个唯一的索引,并在数据库级别强制执行该索引。这将不允许您插入或更新系统中存在的电子邮件。
关于您想要进行的逻辑检查,为什么不在更新时使用相同的代码进行创建,同时检查_id
是否与$ne
不同
(我假设您正在使用文档_id
进行更新,否则您将使用实际的电子邮件进行更新?)
const documentToUpdateId = new ObjectId(req.body._id);
const emailExists = await Foodlancer.findOne({ email: req.body.email, _id: {$ne: documentToUpdateId}});
if (emailExists) {
return res.status(400).json({ error: 'Email already used' });
}