簡體   English   中英

在Meteor應用中安排Mongo集合清理

[英]Schedule Mongo collection cleanup in Meteor app

因此,我創建了一個應用程序,基本上可以讓我的隊友填寫並提交表格。 在原始測試中,Meteor將隨機刷新頁面(即使沒有更新任何依賴的數據源),它們也會丟失已經在表格中輸入的信息。 因此,我通過使應用程序在一個單獨的Mongo集合中生成一個臨時文檔,從而破解了雙向數據綁定解決方案,該文檔將存儲表單數據,直到用戶完成並提交表單為止-此時,該應用程序將刪除臨時文件。 我還使用Iron路由器使用新文檔的ID動態生成唯一頁面。

我的問題是,如果用戶不提交或取消表單,那么該文檔也不會被刪除,而我剩下的是一堆不必要的數據。 我想每周清理一次Meteor集合,但是我不知道該如何做。 我不確定這里是否有相關的代碼,但是我包含了創建和刪除臨時文檔的事件:

Screens = new Meteor.Collection('screens') // where forms will ultimately be stored
Forms = new Meteor.Collection('forms') // form templates
NewScreen = new Meteor.Collection('newscreen') //used for temporary data storage

//event that generates temporary object when users start new form
'click [name=new-screen]': function(e, tmpl) {
      NewScreen.insert({
        first: '',
        role: this.position_name,
        answers: [],
        form_id: this._id,
        position_name: this.position_name,
        form_bundle: this.form_bundle,
        created_at: new Date
      });


//event that stores form data in the final collection, and removes the temporary storage document

'click [name=submit]': function(e, tmpl) {
      e.preventDefault();

      var newObj = {};
      var q_elements = $('.question-form li');
      var a_elements = $('textarea');
      var ca_elements = $('.correct-answer');
      var qa_bundle = []

      for(i=0; i<q_elements.length; i++){
        myObj={}
        myObj['question'] = q_elements[i].innerHTML;
        myObj['answer'] = a_elements[i+1].value;
        myObj['correct_answer'] = ca_elements[i].innerHTML.split('</b> ')[1];
        qa_bundle.push(myObj);
      }

      newObj['name'] = $('input')[0].value;
      newObj['prescreen_notes'] = $('#prescreen-notes')[0].value;
      newObj['role'] = this.position_name;
      newObj['qa_bundle'] = qa_bundle;
      newObj['created_at'] = new Date;


      Screens.insert(newObj);

      for(i=0;i<$('input').length; i++){
        $('input')[i].value = '';
      }

      for(i=0;i<$('textarea').length; i++){
        $('textarea')[i].value = '';
      }

      $('#new-id')[0].innerHTML = 'Link to candidate prescreen: <a href="/screens/' + Screens.find().fetch()[Screens.find().fetch().length-1]._id +'">' + Screens.find().fetch()[Screens.find().fetch().length-1]._id + '</a>';

      NewScreen.remove({_id: window.location.pathname.split('/')[window.location.pathname.split('/').length-1]})  
    },

如果有幫助,我將“流星構建”命令吐出的應用程序版本提交到github倉庫中,以使其成為一個node.js應用程序: https : //github.com/gharezlak/prescreens

我認為您可以在用戶要求表單時設置超時事件。 根據您的應用程序邏輯,事件時間可以是數小時或數天。

當提高偶數時,您將檢查是否提交了表單,並根據需要清理單個文檔。

使用sync-cron程序包

SyncedCron.add({
  name: 'Cleanup NewScreen Colleciton',
  schedule: function(parser) {
    return parser.text('every weekend');
  },
  job: function() {
    var date = new Date();
    date.setDate(date.getDate() - 1);  // 1 day ago
    NewScreen.remove({createdAt: { $lt: date }})
  }
});

但是,最好在客戶端將這些臨時值存儲在本地存儲中。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM