복붙노트

[MONGODB] MongoDB를 문서의 N 번호를 삭제하는 방법

MONGODB

MongoDB를 문서의 N 번호를 삭제하는 방법

내 컬렉션에서, 문서 상태 및 타임 스탬프와 같은 키가 포함되어 있습니다. 그때 최신 열 문서를 검색 할 때 나는 다음과 같은 쿼리를 작성

db.collectionsname.find().sort({"timestamp"-1}).limit(10)

이 쿼리는 제가 원하는 결과를 제공하지만 그때 나는 다음과 같은 쿼리를 작성했다 최신 열 문서를 삭제하고자 할 때

db.collectionsname.remove({"status":0},10).sort({"timestamp":-1})

그러나 다음과 같은 오류가 표시됩니다     형식 오류는 '일종의'정의되지 않은 방법을 호출 할 수 없습니다 다시 나는 다음과 같은 쿼리를 작성     db.collectionsname.remove ({ "상태": 0}, 10) 그것은 단지 하나의 문서를 삭제합니다. 그래서 어떻게 10 개 최신 문서 및 종류의 타임 스탬프를 삭제하는 쿼리를 작성할 수 있습니까?

해결법

  1. ==============================

    1.제거 또는 findAndModify을 사용할 때 제한을 설정할 수 없습니다. 당신이 정확하게 문서의 수를 제거 제한 할 경우에 따라서, 당신은 두 단계를 수행해야합니다.

    제거 또는 findAndModify을 사용할 때 제한을 설정할 수 없습니다. 당신이 정확하게 문서의 수를 제거 제한 할 경우에 따라서, 당신은 두 단계를 수행해야합니다.

    db.collectionName.find({}, {_id : 1})
        .limit(100)
        .sort({timestamp:-1})
        .toArray()
        .map(function(doc) { return doc._id; });  // Pull out just the _ids
    

    그런 다음 제거 방법에 반환 _ids을 통과 :

    db.collectionName.remove({_id: {$in: removeIdsArray}})
    

    참고 : 당신은 덮인 컬렉션에서 문서를 제거 할 수 없습니다.

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

    2.N 삭제할 레코드 수하자.

    N 삭제할 레코드 수하자.

        db.collectionName.find().limit(N).forEach(doc => 
         { 
           db.collectionName.remove({_id:doc._id})
         }
        )
    
  3. ==============================

    3.컬렉션의 myCollection 문서의 N 번호를 제거하려면 :

    컬렉션의 myCollection 문서의 N 번호를 제거하려면 :

    db.getCollection('myCollection').find({}).limit(N).forEach(function(doc){
        db.getCollection('myCollection').remove({_id: doc._id});
    })
    
  4. ==============================

    4.또 다른 방법은 파이썬 스크립트를 작성하는 것입니다.

    또 다른 방법은 파이썬 스크립트를 작성하는 것입니다.

    from pymongo import MongoClient
    
    def main():
        local_client = MongoClient()
        collection = local_client.database.collection
        cursor = collection.find()
        total_number_of_records = 10000
    
        for document in cursor:
            id = document.get("_id")
    
            if total_number_of_records == 100:
                break
    
            delete_query = {"_id": id}
            collection.delete_one(delete_query)
    
            total_number_of_records -= 1
    
    if __name__ == "__main__":
        # execute only if run as a script
        main()
    
  5. ==============================

    5.쿼리 SQL IS

    쿼리 SQL IS

    db.order.find({"业务员姓名" : "吊炸天"},{"业务员编号":0}).sort({ "订单时间" : -1 })
    

    결과는

    {
    "_id" : ObjectId("5c9c875fdadfd961b4d847e7"),
    "推送ID" : "248437",
    "订单时间" : ISODate("2019-03-28T08:35:52Z"),
    "订单状态" : "1",
    "订单编号" : "20190328163552306694",
    "业务员姓名" : "吊炸天"
    }
    {
    "_id" : ObjectId("5c9c875fdadfd961b4d847e8"),
    "推送ID" : "248438",
    "订单时间" : ISODate("2019-03-28T08:35:52Z"),
    "订单状态" : "1",
    "订单编号" : "20190328163552178132",
    "业务员姓名" : "吊炸天"
    }
    {
    "_id" : ObjectId("5c9c875fdadfd961b4d847e5"),
    "推送ID" : "248435",
    "订单时间" : ISODate("2019-03-28T08:35:51Z"),
    "订单状态" : "1",
    "订单编号" : "20190328163551711074",
    "业务员姓名" : "吊炸天"
    }
    {
    "_id" : ObjectId("5c9c875fdadfd961b4d847e6"),
    "推送ID" : "248436",
    "订单时间" : ISODate("2019-03-28T08:35:51Z"),
    "订单状态" : "1",
    "订单编号" : "20190328163551758179",
    "业务员姓名" : "吊炸天"
    }
    

    이제 3 개, 4 데이터를 삭제

    var name = ["吊炸天"]
    var idArray = db.order.find({"业务员姓名" : {$in:name}},{"订单编号":1,})
                    .sort({ "订单时间" : -1 })
                    .skip(2)
                    .map(function(doc){return doc.订单编号})
    
    db.order.deleteMany({"订单编号":{$in:idArray}})
    

    반환 결과는

    {
    "acknowledged" : true,
    "deletedCount" : 2
    }
    
  6. ==============================

    6.쿼리 아래 찾아 컬렉션에서 최신 10 개 문서를 삭제합니다 -

    쿼리 아래 찾아 컬렉션에서 최신 10 개 문서를 삭제합니다 -

    db.collectionsname.findAndModify({
        query: { 'status':0 },
        sort: { 'timestamp': -1 },
        limit: 10,
        remove: true
    });
    
  7. from https://stackoverflow.com/questions/19065615/how-to-delete-n-numbers-of-documents-in-mongodb by cc-by-sa and MIT license