Подтвердить что ты не робот

Как удалить N номеров документов в mongodb

В моих коллекциях документы содержат ключевые статусы и временные метки. Когда я хочу найти последние десять документов, я пишу следующий запрос

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

Этот запрос дает мне результаты, которые я хочу, но когда я хочу удалить последние десять документов, я написал следующий запрос

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

но он показывает следующую ошибку   TypeError: Cannot call method 'sort' of undefined и снова я написал тот же запрос, что и ниже   db.collectionsname.remove({"status":0},10) Он удаляет только один документ. Итак, как я могу написать запрос, который удаляет десять последних документов и сортирует по метке времени?

4b9b3361

Ответ 1

Вы не можете установить предел при использовании remove или findAndModify. Итак, если вы хотите точно ограничить количество удаляемых документов, вам нужно сделать это в два этапа.

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

Затем передайте возвращенный _id методу удаления:

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

К вашему сведению: вы не можете удалить документы из закрытой коллекции.

Ответ 2

Пусть N будет количеством записей для удаления.

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

Ответ 3

Чтобы удалить N количество документов в вашей коллекции myCollection:

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

Ответ 4

SQL-запрос

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
}

Ответ 5

Другой способ - написать скрипт на Python.

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()

Ответ 6

Ниже запрос найдет и удалит последние 10 документов из коллекции: -

db.collectionsname.findAndModify({
    query: { 'status':0 },
    sort: { 'timestamp': -1 },
    limit: 10,
    remove: true
});