Meteor / python / mongoDB - 如何从后台运行进程更新mongoDB?

时间:2016-04-02 22:32:38

标签: python mongodb meteor

我已经开始创建一个流星应用程序,我想在我使用后台任务定义的一个mongoDB集合中插入文档。

例如,想想我每天都在阅读RSS订阅源并抓取网站上的新闻标题。

要求

  1. 阅读RSS订阅源并抓取必要的网站。
  2. 将新标题放入流星App使用的mongoDB集合中。
  3. 我所知道的

    我知道怎么做1.使用python,requests和其他库。 我知道如何通过javascript在meteor中将信息添加到集合中,但是 NOT 通过后台任务添加todo示例应用程序教程。

    可能的解决方案

    1. 在python中获取数据,然后通过python将该数据添加到mongoDB Collection。然后,这将在某种后台进程上在服务器上运行。
    2. 使用某种来自meteor的库,它允许我运行后台任务和webscraping,然后我可以使用它来更新集合。
    3. 最少的例子来自this step of the todo app

      我想要自动化的步骤:

      meteor mongo
      db.tasks.insert( { text : 'New title' , createdAt: new Date() } );
      

      其中New title是某些报废/ RSS Feed的结果。

      实现这一目标的最佳方法是什么?我对python比较流利,但对于JS和流星来说却是全新的。

      其他评论

      此外,我未在下面的示例中包含此内容,但我还想使用accounts-uiaccounts-password个包,并删除insecure包。不确定这会如何影响后台进程的实现。

      最小示例

      (对不起,如果这不是很小但不确定如何缩小它)

      • 客户端
        • main.html中
        • main.jsx
      • 服务器
        • main.js
      • 进口
        • API
          • tasks.js
        • UI
          • App.jsx
          • Task.jsx
        

      的客户机/ main.html中

      <head>
        <title>Todo List</title>
      </head>
      <body>
        <div id='render-target'></div>
      </body>
      
        

      的客户机/ main.jsx

      import React from 'react';                                                                  
      import { Meteor } from 'meteor/meteor';
      import { render } from 'react-dom';
      
      import App from '../imports/ui/App.jsx';
      
      Meteor.startup( () => {
          render( <App/> , document.getElementById( 'render-target' ) );
      });
      
        

      服务器/ main.js

      import '../imports/api/tasks.js'
      
        

      进口/ API / tasks.js

      import { Mongo } from 'meteor/mongo';                                                       
      
      export const Tasks = new Mongo.Collection( 'tasks' );
      
        

      进口/ UI / App.jsx

      import React , { Component , PropTypes } from 'react';                                      
      import { createContainer } from 'meteor/react-meteor-data';
      
      import { Tasks } from '../api/tasks.js';
      
      import Task from './Task.jsx';
      
      class App extends Component {
      
          renderTasks() {
              return this.props.tasks.map( ( task ) => (
                  <Task key={task._id} task={task} />
              ) );
          }   
      
          render() {
              return (
                  <div className='container'>
                      <header>
                          <h1>Todo List</h1>
                      </header>
      
                      <ul>
                          { this. renderTasks() }
                      </ul>
                  </div>
              );
          }   
      }
      
      App.propTypes = { 
          tasks : PropTypes.array.isRequired,
      };
      
      export default createContainer( () => {
          return {
              tasks : Tasks.find( {} ).fetch(),
          };  
      } , App );
      
        

      进口/ UI / Task.jsx

      import React, { Component , PropTypes } from 'react';                                       
      
      // Task component - represents a single todo item
      export default class Task extends Component {
          render() {
              return (
                  <li>{this.props.task.text}</li>
              );
          }   
      }
      
      Task.propTypes = { 
          // This component gets the task to display through a React prop.
          // We can use propTypes to indicate it is required
          task: PropTypes.object.isRequired,
      };
      

1 个答案:

答案 0 :(得分:1)

使用您最熟悉的语言和工具进行抓取和插入,因为您提到python我认为这将是您的选择。 Pymongo可以很容易地将python dicts编写成mongo。

您可以运行自己的mongo版本或访问默认版本。要获取默认的连接字符串,请cd进入meteor目录并键入:

$ meteor mongo -U

它可能类似于mongodb://127.0.0.1:3001 / meteor。所以,从python连接到它:

from pymongo import MongoClient
connection = MongoClient("mongodb://127.0.0.1:3001/meteor")                           
db = connection.meteor.tasks

然后执行插入:

db.insert({ 'text' : title , 'createdAt': datetime.datetime.utcnow()} )

如果您使用自己的数据库,则响应性流星组件将每十秒更新一次(轮询)。如果您使用默认值,它将是即时的。