【问题标题】:How to check if document with certain fields already exists in the MongoDB database?如何检查具有某些字段的文档是否已存在于 MongoDB 数据库中?
【发布时间】: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 : true atlas 如果 playerN 在 DB 中不存在,那么 players_exist : false 在这种情况下,您的查询将写入所有玩家,无论他们是否已经存在或不是(基本上你的代码只有在玩家数组中的最后一个玩家不存在时才有效)
  • 你的球员数组中的每个球员与球队的关系如何?当您说您不希望团队名称被重复时!我没有看到正在插入团队名称的任何地方(是在每个玩家的记录中)..
  • players_exist的值默认设置为false。如果 player1 存在于数据库中,则更改为 true,否则保持原样。意味着如果 player2 不在数据库中,则变量不会更改为 false。这样,如果任何玩家在数据库中,最终结果将为 true .
  • 不,球队名称与球员无关。这是另一个也不应该被复制的对象。
  • 我不知道你是否明白我在说什么!您正在对玩家列表执行insertMany,那么单个值players_exist 如何决定玩家是否存在..

标签: javascript node.js mongodb validation mongoose


【解决方案1】:

有一个mongodb操作符$exists来检查一个字段是否存在于文档中。

用法

以下示例使用一个名为 records 的集合,其中包含以下文档

{ a: 5, b: 5, c: null }
{ a: 3, b: 7, c: 8 }
{ a: 9, c: 9 }
{ a: 1, b: 2, c: 3 }
{ a: 2, c: 5 }
{ a: 3, b: 2 }

下面可以用来检查所有b不存在的文档

b : { $exists: false }:

结果由那些不包含字段 b 的文档组成:

{ a: 9, c: 9 }
{ a: 2, c: 5 }

在您的情况下,使用上述查询检查集合中是否已经存在文档。然后可以在返回结果后有条件地插入文档。

【讨论】:

    【解决方案2】:

    可能的解决方案是在回调中放置条件代码。这将允许您在根本不需要布尔值的情况下处理它

    从玩家列表构建$or 谓词允许您通过对数据库的单个查询而不是每个玩家的查询来检查players_exist。

    Team.count({name: team.name}, function(err, count){
        if (count == 0){
            let playerquery = [];
            players.forEach(function(player){ 
               playerquery.push({ name: player.name, 
                                  surname: player.surname}); 
            })
            Player.count({$or:playerquery}, function(err, count){
                if (count == 0){
                    Player.insertMany(players, function(err){
                            if(err) {
                                console.log(err);
                            }
                    })
                    team.save(function(err){});
                }
            })
       }
    })
    

    【讨论】:

      猜你喜欢
      • 2021-08-11
      • 2017-11-22
      • 1970-01-01
      • 2019-02-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-16
      • 2018-12-02
      相关资源
      最近更新 更多