我一直无法找到有关如何执行此操作的任何文档或示例,但肯定是可能的。基本上,我想保留最近的20条记录。我想按日期(降序)排序,跳过20,然后删除残羹剩饭。
答案 0 :(得分:1)
您可以分两步完成 - 1,存储20个最新_id
个,然后2个,使用remove
执行$nin
。示例代码如下,您可以在我的Saturn Fiddle上玩。我使用number
,但显然你可以使用一些UNIX时间戳。
// Welcome to SaturnAPI!
// Start collaborating with MongoDB fiddles and accomplish more.
// Start your code below these comments.
// Create a new collection
var Posts = new Mongo.Collection(null);
//Insert some data
Posts.insert({
number: 1,
author: "Saturn Sam",
message: "Hello!"
});
Posts.insert({
number: 2,
author: "Saturn Sam2",
message: "Hello!"
});
Posts.insert({
number: 3,
author: "Saturn Sam3",
message: "Hello!"
});
var recent = Posts.find({number: {$gte: 2}}).fetch().map(function (thisPost) {
return thisPost._id;
});
// Remove all but recent
Posts.remove({_id: {$nin: recent}});
// Returns all remaining records
Posts.find({}).fetch()
答案 1 :(得分:0)
我建议去限制20个文件的上限收集。 它将在插入新的时删除最后一个。 希望它会有所帮助
答案 2 :(得分:0)
正如我在收集答案的评论中所提到的,我在我的收藏中有我希望按特定ID分组的文档,然后限制为最近的20个。这不是完美的答案,因为它不会自动删除文档,但它似乎是我的最佳选择。
我在排序结果中找到了第21个文档。如果存在第21个文档(因为我可能只有20个或更少),那么我删除它以及比我的类别和子类别更旧的所有内容。
_id
是ObjectId
。
db.logs.find({'catID': catID, 'subID': subID}, {_id: 1}).sort({'_id': -1}).skip(20).limit(1, function (err, docs) {
if(!err && docs.length) {
// If there was a 21st _id, remove it and all logs older than it for that category and subcategory
db.logs.remove({'catID': catID, 'subID': subID, '_id': {$lte: mongojs.ObjectId(docs[0]._id)}}, callback);
return;
}
callback(err, docs);
});