当某个日期小于新的Date()时,如何从mongodb集合中删除文档

时间:2015-07-21 12:48:26

标签: javascript mongodb mongoose

当文档中的某些MongoDB小于date时,我尝试删除(在导入新文档时)我的new Date()集合中的某些文档。

每当我导入文档时,我都会检查是否存在需要删除相同STATION_ID的文档。

现在我使用mongoose这样做:

function doTheStuff(stationid, time, callback) {
  OwnMetarDoc.find({
    STATION_ID: stationid[0]
  }, function(err, entry) {
    var isTaf = false;
    if (entry[0] != undefined) {
      if (entry[0].TIME) {
        var entryObjectTimerec = entry[0].TIME;
        var isTaf = true;
      };
      var d = new Date;
      var month = d.getUTCMonth();
      var year = d.getUTCFullYear();
      var timeRecConverted = new Date(year, month, parseInt(entryObjectTimerec.substring(0, 2)),
          parseInt(entryObjectTimerec.substring(2, 4)), parseInt(entryObjectTimerec.substring(4, 6)));
      //The relevant part
      if (timeRecConverted.getTime() < new Date() && isTaf == true) {
        OwnMetarDoc.remove({
          _id: entry[0]._id
        }, function(err, result) {
          if (err) {
            console.log(err);
          } else {
            console.log('old taf entry removed');
          };
        });
      }
      if (typeof callback === 'function') {
          callback()
      };
    };
  })
};

但是当我有超过100条&000条目和多个回调时,这会花费太长时间。

有人知道是否有办法快速自动地实现这一目标?

我知道当我必须在Schema中删除一个早于f.e八小时的文档时,该怎么做:

var ownMetarSchema = new Schema({
  STATION_ID: String,
  TIMERECASDATE: {
    type: Date,
    expires: 28800
  }
})

但我不知道如何用我之前的例子来做这件事。

ps:我对Javascript相对较新,您可能需要更多信息,请问我。

2 个答案:

答案 0 :(得分:0)

如果我理解,您想要更新您的文档。你应该阅读mongo文档。这里:http://docs.mongodb.org/manual/tutorial/modify-documents/您可以使用新值替换所有值。希望有所帮助。

答案 1 :(得分:0)

如果你知道你的天气预报有多长,我会假设你会使用TTL部分。由于您尚未使用TTL,这意味着您的预测可能是未来一天甚至一个月(仅供讨论)。

您正在查找包含STATION_ID的所有文档并通过它进行解析。相反,您可以执行以下操作:

如果您的字段date具有确切的时间戳,则只需运行

db.collection.remove({'date':{'$lt': new Date()} })

http://docs.mongodb.org/manual/reference/method/db.collection.remove/

这将删除日期小于当前日期的所有文档。如果需要,还可以添加station_id字段。但是对于天气,我认为没有必要。

我建议在单独的线程/ cron作业中执行此删除操作,而不是在推送数据时执行此操作。