Jak skutecznie usuwać dokumenty za pomocą kwerendy w mongo?

Mam zapytanie, które wybiera dokumenty do usunięcia. Teraz usuwam je ręcznie, w ten sposób (używając pythona):

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

To nie wydaje się być bardzo wydajne. Czy jest lepszy sposób?

EDYTOWAĆ

OK, jestem winien przeprosiny za zapomnienie wspomnienia szczegółów zapytania, ponieważ ma to znaczenie. Oto kompletny kod Pythona:

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

Co więc robi? Zmniejsza liczbę duplikatów kluczy maksymalniemax_group_size na wartość klucza,pozostawiając tylko najnowsze rekordy. Działa tak:

MR dane do(key, count) pary.Iteruj wszystkie pary zcount > max_group_sizeZapytanie o dane wedługkey, podczas sortowania, rosnąco według znacznika czasu (najpierw najstarszy) i ograniczając wynik docount - max_group_size najstarsze zapisyUsuń każdy znaleziony rekord.

Jak widać, realizuje to zadanie zredukowania duplikatów do maksymalnie N najnowszych rekordów. Tak więc są dwa ostatnie krokiforeach-found-remove i to jest ważny szczegół mojego pytania, który zmienia wszystko i musiałem być bardziej szczegółowy - przepraszam.

Teraz o poleceniu usuwania kolekcji. Akceptuje zapytania, ale moje obejmuje sortowanie i ograniczanie. Czy mogę to zrobić za pomocą usuwania? Cóż, próbowałem:

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

Ta próba zawodzi żałośnie. Ponadto wydaje się, że przykręca mongo.Obserwuj:

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

Nie trzeba dodawać, że podejście foreach-found-remove działa i daje oczekiwane rezultaty.

Teraz mam nadzieję, że dostarczyłem wystarczającego kontekstu i (miejmy nadzieję) przywróciłem mój stracony honor.

questionAnswers(4)

yourAnswerToTheQuestion