Mongojs:使用排序删除并跳过

Mongojs: Remove with sort and skip

我一直无法找到关于如何执行此操作的任何文档或示例,但肯定是可行的。基本上,我想保留 20 个最近的记录。我想按日期排序(降序),跳过 20,然后去掉剩余的。

我建议使用 20 个文档的上限集合。 它会在插入新的时删除最后一个。 希望对你有帮助

您可以分两步完成——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()

正如我在对上限 collection 答案的评论中提到的,我的 collection 中有一些文档,我想按某个 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);
});