Wie man Dokumente durch Abfrage effizient in Mongo löscht?

Ich habe eine Abfrage, die zu entfernende Dokumente auswählt. Im Moment entferne ich sie manuell wie folgt (mit Python):

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

Dies scheint nicht sehr effizient zu sein. Gibt es einen besseren Weg?

BEARBEITEN

OK, ich möchte mich dafür entschuldigen, dass ich vergessen habe, die Details der Abfrage zu erwähnen, weil es darauf ankommt. Hier ist der vollständige Python-Code:

<code>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']
</code>

Also, was macht es? Es reduziert die Anzahl der doppelten Schlüssel auf höchstensmax_group_size pro Schlüsselwert,Lässt nur die neuesten Aufzeichnungen. Es funktioniert so:

MR die Daten an(key, count) Paare.Iteriere über alle Paare mitcount > max_group_sizeDaten abfragen nachkeysortieren Sie es aufsteigend nach dem Zeitstempel (dem ältesten zuerst) und begrenzen Sie das Ergebnis aufcount - max_group_size älteste AufzeichnungenLöschen Sie jeden gefundenen Datensatz.

Wie Sie sehen, wird damit die Aufgabe gelöst, die Duplikate auf höchstens N neueste Datensätze zu reduzieren. Die letzten beiden Schritte sind alsoforeach-found-remove und dies ist das wichtige detail meiner frage, das alles verändert und ich musste genauer darüber reden - sorry.

Nun zum Befehl collection remove. Es akzeptiert Abfragen, aber meine beinhalten Sortieren und Begrenzen. Kann ich das mit remove machen? Nun, ich habe versucht:

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

Dieser Versuch scheitert kläglich. Außerdem scheint es mongo zu verarschen.

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

Es erübrigt sich zu erwähnen, dass der foreach-found-remove-Ansatz funktioniert und die erwarteten Ergebnisse liefert.

Jetzt hoffe ich, dass ich genug Kontext zur Verfügung gestellt und (hoffentlich) meine verlorene Ehre wiederhergestellt habe.

Antworten auf die Frage(4)

Ihre Antwort auf die Frage