簡體   English   中英

如何檢查具有某些字段的文檔是否已存在於 MongoDB 數據庫中?

[英]How to check if document with certain fields already exists in the MongoDB database?

我正在嘗試檢查數據庫中是否已存在具有某些字段的文檔。

我有一個玩家對象,我想確保數據庫中沒有另一個具有相同名稱和姓氏的對象。 我還想檢查團隊名稱是否已經出現。

下面的代碼不起作用,因為回調函數中的代碼在它們下面的 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){});
}

有一個 mongodb 運算符$exists來檢查文檔中是否存在字段。

用法

以下示例使用名為記錄的集合與以下文檔

{ 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 }

在您的情況下,使用上述查詢檢查集合中是否存在文檔。 然后可以在返回結果后有條件地插入文檔。

一種可能的解決方案是在回調中放置條件代碼。 這將允許您在完全不需要布爾值的情況下進行處理

從玩家列表構建$or謂詞允許您通過對數據庫的單個查詢而不是每個玩家的查詢來檢查玩家存在。

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){});
            }
        })
   }
})

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM