如何根据年龄或创建日期删除mongodb集合?

时间:2015-07-17 04:24:09

标签: javascript node.js mongodb mongoose

我有一堆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 APINode.JS(JavaScript)实现这一目标?

我会假设使用

setIntervaldb.dropCollection

1 个答案:

答案 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会在你给你的新名字写一些东西时立即这样做。