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:
(key, count)
pary.Iteruj wszystkie pary zcount > max_group_size
Zapytanie 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.