[MONGODB] 어떻게 효율적으로 몽고에서의 요청에 의한 문서를 삭제하려면?
MONGODB어떻게 효율적으로 몽고에서의 요청에 의한 문서를 삭제하려면?
나는 문서를 선택하는 쿼리가 제거되어야한다. 지금, 나는이 (사용 파이썬)처럼 수동으로 제거 :
for id in mycoll.find(query, fields={}):
mycoll.remove(id)
이것은 매우 효율적으로 될 것 같지 않습니다. 더 좋은 방법이 있나요?
편집하다
OK, 나는 그것이 중요하기 때문에, 쿼리 세부 사항을 언급 잊고에 대한 사과를 빚지고있다. 여기에 전체 파이썬 코드는 다음과 같습니다
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에서에 중복 키의 수를 줄일 수 있습니다. 그것은 다음과 같이 작동합니다 :
당신이 볼 수 있듯이, 이것은 대부분의 N 새로운 기록을에 중복을 줄이는 작업을 수행합니다. 그래서, 마지막 두 단계는 foreach는 발견 된-제거는이 변경 모든 것을 내가 그것에 대해 더 구체적으로해야한다고, 내 질문의 중요한 세부 사항입니다 - 죄송합니다.
이제 컬렉션 삭제 명령에 대한. 이 쿼리 동의 않지만, 내 정렬 및 제한이 포함됩니다. 나는 그것을 제거와 함께 할 수 있습니까? 글쎄, 나는 시도했다 :
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는 발견 된-제거 방법 작품과 수익률 예상되는 결과가.
지금, 나는 내가 충분히 상황과 (희망) 복원 한 내 잃어버린 명예를 제공하고 있습니다 바랍니다.
해결법
-
==============================
1.당신은 일치하는 모든 문서를 제거하는 쿼리를 사용할 수 있습니다
당신은 일치하는 모든 문서를 제거하는 쿼리를 사용할 수 있습니다
var query = {name: 'John'}; db.collection.remove(query);
일치하는 문서 번호가 높으면하지만, 데이터베이스가 덜 반응 얻을 수 있습니다,주의하십시오. 그것은 종종 작은 덩어리에서 삭제 된 문서에 좋습니다.
하자의 말, 당신은 콜렉션에서 삭제할 100,000 문서를 가지고있다. 100 개 쿼리를 실행하는 것이 좋습니다 그 삭제 1K 문서를 모두 100,000 문서를 삭제 한 쿼리에 비해 각각.
-
==============================
2.직접 MongoDB의 스크립트 언어를 사용하여 제거 할 수 있습니다 :
직접 MongoDB의 스크립트 언어를 사용하여 제거 할 수 있습니다 :
db.mycoll.remove({_id:'your_id_here'});
-
==============================
3.겠습니까 deleteMany ()는 더 효율적? 나는 최근에 삭제 ()가 100m의 문서 컬렉션에서 6m 문서에 매우 느린 것으로 나타났습니다. 에서 문서 (https://docs.mongodb.com/manual/reference/method/db.collection.deleteMany)
겠습니까 deleteMany ()는 더 효율적? 나는 최근에 삭제 ()가 100m의 문서 컬렉션에서 6m 문서에 매우 느린 것으로 나타났습니다. 에서 문서 (https://docs.mongodb.com/manual/reference/method/db.collection.deleteMany)
db.collection.deleteMany( <filter>, { writeConcern: <document>, collation: <document> } )
-
==============================
4.cmd를이 쿼리를 실행
cmd를이 쿼리를 실행
당신이 사용하는 경우 Node.js를이 코드를 작성
User.remove({ _id: req.body.id },, function(err){...});
-
==============================
5.나는 경우 많은 수의 레코드 페이징을 추천 할 것입니다.
나는 경우 많은 수의 레코드 페이징을 추천 할 것입니다.
첫째 : 삭제하려는 데이터의 수를 가져옵니다 :
-------------------------- COUNT -------------------------- var query= {"FEILD":"XYZ", 'DATE': {$lt:new ISODate("2019-11-10")}}; db.COL.aggregate([ {$match:query}, {$count: "all"} ])
둘째 : 시작 덩어리로 덩어리를 삭제 :
-------------------------- DELETE -------------------------- var query= {"FEILD":"XYZ", 'date': {$lt:new ISODate("2019-11-10")}}; var cursor = db.COL.aggregate([ {$match:query}, { $limit : 5 } ]) cursor.forEach(function (doc){ db.COL.remove({"_id": doc._id}); });
이 빠른해야한다 :
var query={"FEILD":"XYZ", 'date': {$lt:new ISODate("2019-11-10")}}; var ids = db.COL.find(query, {_id: 1}).limit(5); db.tags.deleteMany({"_id": { "$in": ids.map(r => r._id)}});
from https://stackoverflow.com/questions/10014181/how-to-delete-documents-by-query-efficiently-in-mongo by cc-by-sa and MIT license
'MONGODB' 카테고리의 다른 글
[MONGODB] 기계 IP를 사용하여 MongoDB를 연결할 수 없습니다 (0) | 2019.12.15 |
---|---|
[MONGODB] MongoDB를 Linq에 거기에 "쿼리 설명"인가? (0) | 2019.12.15 |
[MONGODB] 유성 및 섬유 / bindEnvironment ()와 함께 무슨 일이야? (0) | 2019.12.15 |
[MONGODB] MongoDB의 : 통합 프레임 워크 : 필드 사이에 $ 일치 (0) | 2019.12.15 |
[MONGODB] 현재 값을 기준으로하여 MongoDB에 값을 업데이트 (0) | 2019.12.15 |