Mongojs:删除排序并跳过

时间:2015-09-15 03:39:02

标签: node.js mongodb mongojs

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

3 个答案:

答案 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个或更少),那么我删除它以及比我的类别和子类别更旧的所有内容。

_idObjectId

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);
});