복붙노트

[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. ==============================

    1.당신은 일치하는 모든 문서를 제거하는 쿼리를 사용할 수 있습니다

    당신은 일치하는 모든 문서를 제거하는 쿼리를 사용할 수 있습니다

    var query = {name: 'John'};
    db.collection.remove(query);
    

    일치하는 문서 번호가 높으면하지만, 데이터베이스가 덜 반응 얻을 수 있습니다,주의하십시오. 그것은 종종 작은 덩어리에서 삭제 된 문서에 좋습니다.

    하자의 말, 당신은 콜렉션에서 삭제할 100,000 문서를 가지고있다. 100 개 쿼리를 실행하는 것이 좋습니다 그 삭제 1K 문서를 모두 100,000 문서를 삭제 한 쿼리에 비해 각각.

  2. ==============================

    2.직접 MongoDB의 스크립트 언어를 사용하여 제거 할 수 있습니다 :

    직접 MongoDB의 스크립트 언어를 사용하여 제거 할 수 있습니다 :

    db.mycoll.remove({_id:'your_id_here'});
    
  3. ==============================

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

    4.cmd를이 쿼리를 실행

    cmd를이 쿼리를 실행

    당신이 사용하는 경우 Node.js를이 코드를 작성

    User.remove({ _id: req.body.id },, function(err){...});
    
  5. ==============================

    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)}});
    
  6. from https://stackoverflow.com/questions/10014181/how-to-delete-documents-by-query-efficiently-in-mongo by cc-by-sa and MIT license