Tôi có một truy vấn, trong đó chọn tài liệu cần xóa. Ngay bây giờ, tôi xóa chúng theo cách thủ công, như thế này (sử dụng python):Làm thế nào để xóa tài liệu theo truy vấn một cách hiệu quả trong mongo?
for id in mycoll.find(query, fields={}):
mycoll.remove(id)
Điều này dường như không hiệu quả lắm. Có cách nào tốt hơn?
EDIT
OK, tôi nợ một lời xin lỗi cho quên đề cập đến các chi tiết truy vấn, bởi vì nó quan trọng. Đây là mã python hoàn chỉnh:
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']
Vì vậy, nó sẽ làm gì? Nó giảm số lượng khóa trùng lặp xuống tối đa max_group_size
cho mỗi giá trị khóa, chỉ để lại các bản ghi mới nhất. Nó hoạt động như sau:
- MR dữ liệu tới
(key, count)
cặp. - lặp qua tất cả các cặp với
count > max_group_size
- Truy vấn dữ liệu bằng cách
key
, trong khi sắp xếp nó tăng dần bởi dấu thời gian (người đầu tiên lâu đời nhất) và hạn chế kết quả chocount - max_group_size
hồ sơ lâu đời nhất - Xóa mỗi kỷ lục được tìm thấy.
Như bạn có thể thấy, điều này hoàn thành nhiệm vụ giảm số bản sao xuống tối đa N bản ghi mới nhất. Vì vậy, hai bước cuối cùng là foreach-found-remove
và đây là chi tiết quan trọng của câu hỏi của tôi, điều đó thay đổi mọi thứ và tôi phải cụ thể hơn về nó - xin lỗi.
Bây giờ, về lệnh xóa bộ sưu tập. Nó chấp nhận truy vấn, nhưng tôi bao gồm phân loại và hạn chế. Tôi có thể làm điều đó với loại bỏ? Vâng, tôi đã thử:
mydb.static.find(key, limit = group_size - max_group_size, sort=[('test_date', ASCENDING)])
Nỗ lực này thất bại thảm hại. Hơn nữa, nó có vẻ như vít mongo.Observe:
C:\dev\poc\SDR>python FilterOoklaData.py
bad offset:0 accessing file: /data/db/ookla.0 - consider repairing database
Không cần phải nói, cách tiếp cận tìm kiếm-tìm-loại bỏ hoạt động và mang lại kết quả mong đợi.
Bây giờ, tôi hy vọng tôi đã cung cấp đủ ngữ cảnh và (hy vọng) đã khôi phục danh dự bị mất của tôi.
Tôi đã chỉnh sửa bài viết của tôi. – mark