15

削除するドキュメントを選択するクエリがあります。現在、次のように(Pythonを使用して)手動で削除しています。

for id in mycoll.find(query, fields={}):
  mycoll.remove(id)

これはあまり効率的ではないようです。より良い方法はありますか?

編集

OK、クエリの詳細について言及するのを忘れたことをお詫びします。それは重要なことだからです。完全な Python コードは次のとおりです。

def reduce_duplicates(mydb, max_group_size):
  # 1. Count the group sizes
  res = mydb.static.map_reduce(jstrMeasureGroupMap, jstrMeasureGroupReduce, 'filter_scratch', full_response = True)
  # 2. For each entry from the filter scratch collection having count > max_group_size
  deleteFindArgs = {'fields': {}, 'sort': [('test_date', ASCENDING)]}
  for entry in mydb.filter_scratch.find({'value': {'$gt': max_group_size}}):
    key = entry['_id']
    group_size = int(entry['value'])
    # 2b. query the original collection by the entry key, order it by test_date ascending, limit to the group size minus max_group_size.
    for id in mydb.static.find(key, limit = group_size - max_group_size, **deleteFindArgs):
      mydb.static.remove(id)
  return res['counts']['input']

それで、それは何をしますか?重複キーの数を最大でもmax_group_sizeキー値ごとに減らし、最新のレコードのみを残します。それはこのように動作します:

  1. (key, count)データをペアに MR します。
  2. すべてのペアを反復処理しますcount > max_group_size
  3. でデータをクエリkeyし、タイムスタンプで昇順 (最も古いものから) に並べ替え、結果をcount - max_group_size最も古いレコードに制限します。
  4. 見つかったすべてのレコードを削除します。

ご覧のとおり、これにより、重複を最大で N 個の最新レコードに減らすというタスクが達成されます。つまり、最後の 2 つのステップはforeach-found-remove、これが私の質問の重要な詳細です。

さて、コレクションの削除コマンドについて。クエリは受け付けますが、ソートと制限が含まれています。removeでできますか?さて、私は試しました:

mydb.static.find(key, limit = group_size - max_group_size, sort=[('test_date', ASCENDING)])

この試みは惨めに失敗します。さらに、それは mongo.Observe を台無しにしているようです:

C:\dev\poc\SDR>python FilterOoklaData.py
bad offset:0 accessing file: /data/db/ookla.0 - consider repairing database

言うまでもなく、foreach-found-remove アプローチが機能し、期待どおりの結果が得られます。

さて、私は十分な文脈を提供し、(うまくいけば)失われた名誉を回復したことを願っています.

4

5 に答える 5

37

クエリを使用して、一致するすべてのドキュメントを削除できます

var query = {name: 'John'};
db.collection.remove(query);

ただし、一致するドキュメントの数が多い場合、データベースの応答が遅くなる可能性があることに注意してください。ドキュメントを小さなチャンクで削除することをお勧めします。

コレクションから削除するドキュメントが 10 万件あるとします。100,000 個のドキュメントをすべて削除する 1 つのクエリを実行するよりも、1,000 個のドキュメントを削除するクエリを 100 回実行する方が適切です。

于 2012-04-04T15:24:45.103 に答える
11

MongoDB スクリプト言語を使用して直接削除できます。

db.mycoll.remove({_id:'your_id_here'});
于 2012-04-04T15:24:04.597 に答える