Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/34.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js Mongojs:使用排序和跳过删除_Node.js_Mongodb_Mongojs - Fatal编程技术网

Node.js Mongojs:使用排序和跳过删除

Node.js Mongojs:使用排序和跳过删除,node.js,mongodb,mongojs,Node.js,Mongodb,Mongojs,我一直找不到关于如何做到这一点的任何文档或示例,但这肯定是可能的。基本上,我想保留20条最新的记录。我想按日期(降序)订购,跳过20个,然后去掉剩余的。我建议购买上限为20个文档的集合。 它将在插入新文件时删除最后一个文件。 希望它会有帮助你可以分两步来做——1,存储最近的20个\u ids,然后2,使用$nin执行删除。下面是示例代码,您可以在my上使用它。我使用的是数字,但您显然可以使用一些UNIX时间戳 // Welcome to SaturnAPI! // Start collabora

我一直找不到关于如何做到这一点的任何文档或示例,但这肯定是可能的。基本上,我想保留20条最新的记录。我想按日期(降序)订购,跳过20个,然后去掉剩余的。

我建议购买上限为20个文档的集合。 它将在插入新文件时删除最后一个文件。
希望它会有帮助

你可以分两步来做——1,存储最近的20个
\u id
s,然后2,使用
$nin执行
删除
。下面是示例代码,您可以在my上使用它。我使用的是
数字
,但您显然可以使用一些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()

正如我在对capped collection答案的评论中所提到的,我在我的收藏中有一些文档,我希望按照某个ID进行分组,然后限制为最近的20个。这不是一个完美的答案,因为它不会自动删除文档,但它似乎是我的最佳选择

我在排序结果中找到了第21个文档。如果存在第21个文档(因为我可能只有20个或更少),那么我会删除它以及我的类别和子类别中比它旧的所有内容

\u id
是一个
对象id

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

谢谢你的回复!我希望有一个更原子化的方法。非原子性地说,我认为更有效的方法是进行排序查找,跳过以获取第20个文档的日期,然后删除所有比该日期更早的内容。我想没有一个命令可以做到这一点?对于原子性,我可以推荐的最接近的解决方案是将删除查询改为使用
$gt
$lt
,而不是
排序
跳过
。如果您按时间戳等进行排序,这可能会起作用。这将非常有效,但是,我简化了我的问题,并忽略了一个事实,即此集合中的文档是分组的。也就是说,我希望为每个子ID保持最大20个文档的大小,这是capped collections无法做到的。