在我的馆藏中,文档包含状态和时间戳等关键字。当我想找到最新的十个文件时,我写下面的查询
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)
它只删除一个文档。那么如何编写一个删除十个最新文档并按时间戳排序的查询呢?
答案 0 :(得分:64)
使用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
传递给remove方法:
db.collectionName.remove({_id: {$in: removeIdsArray}})
仅供参考:您无法从上限集合中删除文档。
答案 1 :(得分:4)
让N为要删除的记录数。
db.collectionName.find().limit(N).forEach(doc =>
{
db.collectionName.remove({_id:doc._id})
}
)
答案 2 :(得分:4)
db.collection.remove({_id:
{ $in: db.collection.find().sort({timestamp:-1}).limit(100).map(a => a._id) }
})
答案 3 :(得分:1)
查询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
}
答案 4 :(得分:1)
要删除集合myCollection
中的N个文档:
db.getCollection('myCollection').find({}).limit(N).forEach(function(doc){
db.getCollection('myCollection').remove({_id: doc._id});
})
答案 5 :(得分:0)
另一种方法是编写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 :(得分:0)
这是另一种方法:
第1步:对临时集合中的文档进行排序和限制以及$ out
db.my_coll.aggregate([
{ $sort: { _id: - 1} },
{ $limit: 10000 },
{ $out: 'my_coll_temp' }
])
步骤2:从原始集合中删除所有文档(由于保留索引,所以不删除)。同样,此步骤可能会使此方法的通用性降低,因为不一定总是可以删除。
db.my_coll.remove({})
第3步:将文档从临时集合移回原始集合
db.my_coll_temp.aggregate([ { $out: 'my_coll' } ])
第4步:删除临时集合
db.my_coll_temp.drop()
答案 7 :(得分:0)
这是我的工作解决方案(受到以上答案的启发):
(对于删除大量记录,$in
运算符有一个限制,因此这是最终解决方案)
删除1,000,000条记录的示例
var ITERATIONS=1000;
var LIMIT=1000;
for(i=0; i<ITERATIONS; i++) {
arr = db.MyCollection.find({}, {_id : 1}).limit(LIMIT).toArray().map(function(doc) { return doc._id; });
db.MyCollection.remove({_id: {$in: arr}});
// sleep(1); // Optional for not loading mongo in case of huge amount of deletions
}
可以在mongo shell或Robomongo 3T中运行它
答案 8 :(得分:-6)
以下查询将查找并删除集合中的最新10个文档: -
{{1}}