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);
});
我一直无法找到关于如何执行此操作的任何文档或示例,但肯定是可行的。基本上,我想保留 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);
});