Как проверить, существует ли документ с определенными полями в базе данных MongoDB? - PullRequest
0 голосов
/ 06 февраля 2020

Я пытаюсь проверить, существует ли документ с определенными полями в базе данных.

У меня есть объект проигрывателя, и я хочу убедиться, что нет другого объекта с таким же именем и фамилией уже в базе данных. Я также хочу проверить, что имя команды еще не указано.

Приведенный ниже код не работает, потому что код в функциях обратного вызова выполняется после оператора 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){});
}

Ответы [ 2 ]

1 голос
/ 06 февраля 2020

Существует оператор mongodb $ существует , чтобы проверить, существует ли поле в документе.

Использование

В следующих примерах используется коллекция именованных записей со следующим документы

{ 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: {$ существует: false}:

Результаты состоят из тех документов, которые не содержат поле b:

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

В вашем случае, проверьте, существует ли уже документ в коллекции, используя вышеупомянутый запрос. После этого вы можете условно вставить документы после возврата результатов.

0 голосов
/ 06 февраля 2020

Единственно возможным решением является размещение условного кода внутри обратного вызова. Это позволит вам обработать это без необходимости использования логических значений

Построение предиката $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){});
            }
        })
   }
})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...