【问题标题】:Schedule Mongo collection cleanup in Meteor app在 Meteor 应用程序中安排 Mongo 收集清理
【发布时间】:2015-12-02 19:25:07
【问题描述】:

所以我创建了一个应用程序,基本上可以让我的队友填写和提交表格。在最初的测试中,Meteor 会随机刷新页面(即使没有更新依赖的数据源),它们会丢失表单中已经输入的信息。因此,我通过让应用程序在单独的 Mongo 集合中生成一个临时文档来组合双向数据绑定解决方案,该文档将存储表单数据,直到用户完成并提交表单——此时,应用程序删除临时文件。我还使用 Iron Router 使用新文档的 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]})  
    },

如果有帮助,我已经将“meteor build”命令吐出的应用程序版本提交给了一个 github 存储库:https://github.com/gharezlak/prescreens

【问题讨论】:

    标签: javascript node.js forms mongodb meteor


    【解决方案1】:

    我认为你可以设置一个超时事件 当用户要求表格时。 根据您的应用程序逻辑,事件时间可以是几小时或几天。

    当 even 被提出时,你会检查表单是否被提交, 并根据需要清理单个文档。

    【讨论】:

    • 感谢您的回答!我将尝试这个和其他几个建议的解决方案,看看哪一个效果最好。
    【解决方案2】:

    使用synced-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 }})
      }
    });
    

    但是,最好将这些临时值在客户端存储在本地存储中。

    【讨论】:

    • 非常感谢您的回答!我今天将尝试实现它。
    猜你喜欢
    • 1970-01-01
    • 2015-11-17
    • 1970-01-01
    • 1970-01-01
    • 2016-09-15
    • 1970-01-01
    • 2015-12-14
    • 2016-05-27
    • 2015-02-23
    相关资源
    最近更新 更多