0

データベースをループして、適切な値を見つけて、別のファイルの適切なセルに挿入したいと思います。おそらくcsv、またはその他の人間が読める形式です。擬似コード:

for item in huge_db:
   for list_of_objects_to_match:
      if itemmatch():
         if there_arent_three_matches_yet_in_list():
            matches++
            result=performoperationonitem()
            write_in_file(result, row=object_to_match_id, col=matches)
         if matches is 3:
            remove_this_object_from_object_to_match_list()

毎回すべての出力ファイルを 1 行ずつ調べる以外の方法を考えられますか? 何を検索すればよいかさえわかりません...さらに良いことに、db で一致する 3 つのオブジェクトを見つけて、結果をリアルタイムで取得するより良い方法はありますか? (操作には時間がかかりますが、RTで結果が飛び出すのを見たいです)

4

1 に答える 1

0

が合理的に単純な関数であると仮定するitemmatch()と、これは、疑似コードよりも優れていると思われることを実行します。

for match_obj in list_of_objects_to_match:
  db_objects = query_db_for_matches(match_obj)
  if len(db_objects) >= 3:
      result=performoperationonitem()
      write_in_file(result, row=match_obj.id, col=matches)
  else:
      write_blank_line(row=match_obj.id)  # if you want

次に、トリックは関数を書くことになりquery_db_for_matches()ます。詳細は省きますが、特定の 1 つのフィールドに一致するオブジェクトを探していると仮定しますtype。pymongo では、そのようなクエリは次のようになります。

def query_db_for_matches(match_obj):
    return pymongo_collection.find({"type":match_obj.type})

これを効率的に実行するには、最初に次のように呼び出して、クエリを実行しているフィールドにデータベースのインデックスがあることを確認してください。

pymongo_collection.ensure_index({"type":1})

最初に呼び出すensure_indexと、膨大なコレクションの場合、長い時間がかかる場合があります。query_db_for_matchesしかし、その後は毎回高速になります。十分に高速で、自分の前に入れることさえでき、find問題ありません。

于 2013-04-06T04:59:37.080 に答える