2016-10-06 5 views
2

現在、Yelp Fusion APIから50のレストランのリストを取得しています。私はこれらのレストランを私のデータベースに保存して、私のアプリケーションでさらに使いたいと思っています。MongoDBとC# - 文書が存在しないかどうかの確認

私はこのリストをユーザーの座標に基づいて取得しているので、APIは既に自分のデータベースにあるレストランを返す可能性があります。重複を避けるために、yelpによって提供されたレストランIDが既にデータベースに存在するかどうかを確認します。既にデータベースに入っている場合、そのレストランは挿入されません。

私はMongoDBデータベースを使用しています。

私は次の関数を使ってこれを実現:この機能で

public async static void CheckSubjects(List<Subject> subjects) 
    { 
     SubjectRepository rep = new SubjectRepository(); 
     List<Subject> insert = new List<Subject>(); 
     foreach (var item in subjects) 
     { 
      if (!rep.SubjectsExists(item).GetAwaiter().GetResult()) 
       insert.Add(item); 
     } 
     if (insert.Count > 0) 
      await rep.CreateAllSubjects(insert); 
    } 

対象はレストランです。リポジトリは、データベースと通信するクラスです。

public async Task<bool> SubjectExists(Subject sub) 
    { 
     var result = await db.Subjects.Find(Builders<Subject>.Filter.Eq("yelp_id", sub.yelp_id)).FirstOrDefaultAsync(); 
     if (result != null) 
      return true; 
     else 
      return false; 
    } 

あなたはそれが既に存在するかどうかを確認するために、データベースへの50回の呼び出しを行うことは非常にパフォーマンスが重いです見ることができます:

これは、レストランが既に存在するかどうかをチェックする私の関数です。私はいくつかの調査を行い、MongoDBからupsert関数を見つけました。私は自分のシナリオでこれをどのように使うことができるのか分かりません。

誰でも私を助けてくれますか?前もって感謝します!

答えて

3

アップデート中にオプションとしてupsertを使用すると、ドキュメントが存在しない場合は作成されます。それぞれのレストランを見つけようとするのではなく、それを入れてみてください。thisのようにupsertを設定して、それぞれについてupdateを呼び出すことができます。

さらに効率的な別の方法unique indexを作成してyelp_idをキーとして設定すると、重複したエントリを挿入すると失敗するため、データベースにすでに存在するかどうか心配する必要はありません。

+0

各レストランのupsertを呼び出してもパフォーマンスは悪いですか? – RandomStranger

+1

私は、あなたが一度ループするように、今はちょっとだけ良いと思う。しかし、私は第二のアプローチがずっと良いと思う。 – andresk

+1

申し訳ありませんが、多くの! – RandomStranger

関連する問題