我有一堆mongodb 集合如下所示,它们是在不同的日期创建的,并使用日期作为名称:
2015-06-01
2015-06-02
2015-06-03
...
2015-06-30
total 30 collections
假设我 ONLY 想要保留最新的 10 系列今天而今天 2015 -06-30 即可。根据他们的名字,你应该知道我只想保留
2015-06-21
2015-06-22
...
2015-06-30
10 collections
然后明天 2015-07-01 ,我仍然希望保留最新的10个集合,同时创建2015-07-01
集合。
所以我必须删除 2015-06-21 以保持总收集数等于10。
然后我会每天重复这个过程,以便在mongodb中保留10天的收集。
如何使用Mongoose API
和Node.JS
(JavaScript)实现这一目标?
setInterval
和db.dropCollection
。
答案 0 :(得分:1)
因此,假设您在日期命名中拥有数据库中的集合列表,如下所示:
[ '2015-01-01',
'2015-01-02',
'2015-01-03',
'2015-01-04',
'2015-01-05',
'2015-01-06',
'2015-01-07',
'2015-01-08',
'2015-01-09',
'2015-01-10',
'2015-01-11',
'2015-01-12' ]
然后,如果您要删除除“今天”之前的所有旧集合,那么您将采用这种方法:
var async = require('async'),
crontab = require('node-crontab'),
mongoose = require('mongoose');
mongoose.connect('mongodb://localhost/crontest');
var conn = mongoose.connection;
conn.once("open",function() {
var jobId = crontab.scheduleJob("0 0 * * *",function() {
var today = new Date().toISOString().substr(0,10);
var db = conn.db;
db.listCollections({ "name": { "$lt": today } })
.toArray(function(err,items) {
var names = items.map(function(item) {
return item.name;
})
async.eachLimit(
names.slice(0,names.length-10),10,function(name,callback) {
db.dropCollection(name,callback);
},function(err) {
if (err) throw err;
console.log('done');
}
);
});
});
});
我只是将整个事情放在node-crontab
中,但你想要的却是。
您需要做的第一件事是从您的猫鼬连接中获取基础本地Db
对象的句柄:
var conn = mongoose.connection;
{ ... }
var db = conn.db;
确保运行时连接“实际打开”。如果您的模型上的其他“猫鼬方法”实际上已被调用,但实际上您应该确定,因此:
conn.once("open",function() {
// everything in here
});
然后,只需要获取今天日期的ISOString,以便应用于.listCollections()
上调用的“过滤器”查询,该查询将根据该过滤器返回您的集合名称(和其他属性) 。你总是不想删除当天。
然后,这只是“切片”该数组的问题,以便只获取那些不在最后10个项目中的集合。因此切片.length-10
以获得从数组的起始索引获取的位置。
然后使用async.eachLimit
将它们传递给循环,因为.dropCollection()
调用是异步的,也是为了“限制”并行运行的任务数。
完成这些工作后,作业即告完成,并删除馆藏。另外,“创建”一个集合(如果你想要的话添加)是没有意义的,因为MongoDB会在你给你的新名字写一些东西时立即这样做。