javascript - 在插入之前检查 MongoDB 值是否存在
问题描述
我正在制作一个带有 Twilio 的 MEAN 应用程序,它允许人们通过向应用程序发送他们的姓名来签署在线请愿书。人们应该只能在请愿书上签名一次。我计划通过每个电话号码只允许一个签名来确保这一点。
每次签署请愿书时,都会创建一个像这样的 Mongo 对象:
{
"_id" : ObjectId("5c5a47ae8f04f9148f43b033"),
"name" : "John Doe",
"number" : "+18373987466",
"date" : "2/5/19"
}
我已经将该number
字段转换为唯一索引,因此每个电话号码只能有签名。
我遇到的问题是当有人试图多次签署请愿书时该怎么办。我想拦截他们的尝试并向他们发送一条消息,说他们已经签署了请愿书。
正如我所看到的,我有两个选择:
选项#1 查询数据库以查看是否已经输入了相同的数字。
这似乎应该很容易,但我就是不知道该怎么做。
var number = '+18373987466';
if(collection.find({"number":number}) {
twiml.message("You have already signed the petition");
}
我的想法是,如果找到具有相同编号的条目,collection.find({"number":number})
它将返回。true
但是,它会返回整个 Mongo 游标。
选项 #2
由于number
是唯一索引,如果使用相同值创建另一个对象,Mongo 将抛出错误。我可以拦截抛出的错误,然后向用户发送消息。
我对这种方法的第一个问题是:故意让您的应用程序抛出错误是一种好的软件设计吗?
我用try/catch
块尝试了这种方法,但抛出的错误立即使应用程序崩溃。
try {
collection.insertOne(
{name : name, number : number, date: dateSigned},
function(error, result) {
console.log(`${name} has been added to the database`);
});
} catch (error) {
// handle error
}
这不是“捕获”错误并防止其崩溃应用程序的正确方法吗?
解决方案
选项1
描述的行为是正确的,如果您使用 MongoDB 将返回一个游标collection.find()
。您可以使用collection.count()。但由于您只对已经存在至少一个值感兴趣,因此您可以调用cursor.limit(1)
.
if (collection.find({"number":number}).limit(1).length === 1)
twiml.message("You have already signed the petition");
选项#2
故意让您的应用程序抛出错误是一种好的软件设计吗?
不,我认为这是糟糕的设计。如果该条目已经存在,我不会将其视为错误,而是需要特殊处理的情况。如果您使用catch()
,您仍然需要检查向用户发送正确消息的错误类型。
想象一下您的数据库无法访问,因此您无法插入新值,这将是一个(真正的)错误,您应该 catch() 它。
推荐阅读
- flutter - 返回类型“小部件?” 不是闭包上下文所要求的“小部件”
- unit-testing - 如何测试 Box 中错误的类型
? - python - loop multiple lists if exist and check for match (Python)
- c++ - Why doesn't my Makefile work when i do something like this?
- facebook - Public Feed API 的请求提交
- sql - 带有内部数组的 Json 中的 MSSQL 搜索
- amazon-web-services - Cloudfront 将行为路径附加到源请求
- linux - 如何确定 .bashrc 是否在 VSCode 终端内运行
- unit-testing - 单元测试检查 DRF 中的对象级别权限或发出警告的通用解决方案
- flutter - Flutter Firestore 查询索引