流星能否正确处理直接从外部更新到MongoDB数据库的数据?

时间:2018-07-23 21:03:37

标签: mongodb meteor

上下文:我已经有一个Nodejs服务器应用程序,该应用程序负责自动读写MongoDB数据库。该服务没有任何公共端点,因此与之通信的唯一方法是通过数据库本身。

现在,我想构建一个独立的Web应用程序,该网站将使用前面提到的MongoDB数据库中的可用数据。这些数据大多数应实时显示给用户。经过一些框架研究,我正在考虑使用Meteor,但找不到有关它是否与现有服务良好集成的有用信息。

所以实际的问题是:我可以在直接和外部使用MongoDB数据库的同时,受益于Meteor的框架,特别是受益于所有实时客户端数据更新吗?

例如,如果我在网站上显示“玩家”表,并且添加了新玩家或在外部MongoDB数据库中直接直接更新了玩家的分数 ,Meteor能否在所有已打开网站的客户中更新分数,还是此要求会使Meteor不适合我的项目?

1 个答案:

答案 0 :(得分:2)

  

我可以从Meteor的框架中受益,特别是从所有   实时客户端数据更新,而直接和外部使用   MongoDB数据库?

流星配置为connect to an external mongo database。您已经将mongo打包在本地开发应用程序上,但这只是为了舒适和轻松集成。

在生产中,您始终必须使用MONGO_URL environment variable将Meteor连接到正在运行的Mongo实例。

奖金:即使在开发模式下,您也可以设置MONGO_URL以在开发模式下连接到特定的数据库。请注意,您可以在此数据库上添加所有内容,请谨慎使用。

引擎盖下,Meteor使用节点mongo驱动程序。基本上,您可以使用此驱动程序的所有API(see this post有关如何调用本机Mongo方法的详细信息)

  

例如,如果我要在网站上显示“玩家”表,然后显示一个新的   玩家被添加或玩家的分数在外部被更新,   直接在基础MongoDB数据库中,Meteor能够   更新所有已打开该网站的客户的分数,或将   这个要求使Meteor不适合我的项目吗?

使用Meteor的publication / subscription system,您基本上可以控制将哪些数据发布到客户端。每次数据更改时都会运行发布(类似于观察者模式)。

如果所有客户都订阅了集合的数据,则一旦集合更新,他们将获得更新。现在是您最想要的功能:如果此数据是由某些外部源更新的,则也可以使用此功能。

它也以非常快的更新间隔工作。我参与了一个最近的项目,该项目通过Mongo-DB集合上的python更新了大量数据。 Meteor应用程序听了它的声音,并“实时”(或用户认为是实时的)向客户端显示数据。

但是,这里有一些陷阱,很高兴提前知道它们。

  1. Meteor创建的文档的字符串类型为_id,而不是Mongo.ObjectID。但是它可以读取和写入if you use it correctly

  2. Meteor使用own API包装集合,该集合将集合与其基于fibers的环境最好地集成在一起。如果您需要使用其他功能,请阅读herehere

  3. Returned cursors的行为略有不同,但是与Collections一样,如果您从rawCollection

  4. 收到光标,则所有本机功能也可用。
  5. 再次检查您在集合上使用的数据类型。例如,坚持使用相同的日期类型(例如ISODate),因此更新后不会出现意外错误。 mongoose还有一个流星副本,名为simpl-schemanpm package),这是在集合上保持结构的好方法。

总而言之,如果您考虑了大多数Meteor指南和API文档,那么您应该处于良好的轨道,因为外部更新的集合的集成通常运行得非常好,并且主要是为了了解pub / sub系统以使其运行


编辑:

  

但是考虑到陷阱1,如果Meteor使用自定义ID,   它真的能够处理添加到集合中的新文档吗?   外部(例如新玩家),如果此新文档的ID   是从外部设置的?

是的,但是您需要知道其他查询。如果(外部创建的)文档具有以下值:

{ "_id" : ObjectId("4ecc05e55dd98a436ddcc47c") }

然后,您必须从以下位置更改(流星)查询

collection.findOne("4ecc05e55dd98a436ddcc47c") // returns undefined

collection.findOne({ "_id" : new Mongo.ObjectID("4ecc05e55dd98a436ddcc47c") }) // returns { _id: ObjectID { _str: '4ecc05e55dd98a436ddcc47c' } }
  

的确,我能够指导Meteor创建文档   自定义ID与我已经创建的ID一致   外部服务?还是我需要使我的外部应用使用与Meteor相似的ID(即字符串)?

相同的模式可用于创建文档。代替

collection.insert({ foo:'bar' })

您传递一个新创建的ObjectID:

collection.insert({ foo:'bar', _id: new Mongo.ObjectID() })
  

谈论潜在的陷阱时,Meteor是否将数据存储在任何   不寻常的方式?我的意思是,它是否将任何集合添加到数据库或任何其他   插入或类似文件以跟踪的特殊字段   这些?

     

或者我可以期望除了   自定义_id字段,它只是一个字符串?

如果使用上述方法在Meteor中创建文档,则不必担心_id是字符串。

文档是应有的方式(请参见data format bridge)。但是,如果您发现这里没有提到的例外情况,请随时发表评论,因为这对其他用户也可能很重要。