Как удалить 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)
Он удаляет только один документ. Итак, как я могу написать запрос, который удаляет десять последних документов и сортирует по метке времени?
Ответы
Ответ 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
});