【发布时间】:2020-02-06 17:19:17
【问题描述】:
我正在尝试检查数据库中是否已经存在具有某些字段的文档。
我有一个玩家对象,我想确保数据库中没有另一个具有相同名称和姓氏的对象。我还想检查团队名称是否尚未出现。
下面的代码不起作用,因为回调函数中的代码在它们下面的 if 语句之后执行,根据应该获取的两个变量的值决定是否应将数据保存在数据库中如果满足特定条件,则在回调函数中更改。
但是,这些变量在 if 语句之后被更改,因此我的代码不起作用。
问题是。如何让回调函数在我想要的时候执行。或者有没有更好的方法来进行这种验证?
这是我的代码:
let team_exists = false;
let players_exist = false;
Team.count({name: team.name}, function(err, count){
if (count>0){
team_exists = true;
}
});
players.forEach((function(player){
Player.count({name: player.name, surname: player.surname}, function(err, count){
if (count>0){
players_exist = true;
}
})
}))
if(!team_exists && !players_exist){
Player.insertMany(players, function(err){
if(err){
cosole.log(err);
}
})
team.save(function(err){});
}
【问题讨论】:
-
你的代码有很多问题!!如果
players是一个数组,当您迭代它时,假设 player1 已经存在于 DB 中,那么players_exist : trueatlas 如果 playerN 在 DB 中不存在,那么players_exist : false在这种情况下,您的查询将写入所有玩家,无论他们是否已经存在或不是(基本上你的代码只有在玩家数组中的最后一个玩家不存在时才有效) -
你的球员数组中的每个球员与球队的关系如何?当您说您不希望团队名称被重复时!我没有看到正在插入团队名称的任何地方(是在每个玩家的记录中)..
-
players_exist的值默认设置为false。如果 player1 存在于数据库中,则更改为 true,否则保持原样。意味着如果 player2 不在数据库中,则变量不会更改为 false。这样,如果任何玩家在数据库中,最终结果将为 true .
-
不,球队名称与球员无关。这是另一个也不应该被复制的对象。
-
我不知道你是否明白我在说什么!您正在对玩家列表执行
insertMany,那么单个值players_exist如何决定玩家是否存在..
标签: javascript node.js mongodb validation mongoose