上下文:我已经有一个Nodejs服务器应用程序,该应用程序负责自动读写MongoDB数据库。该服务没有任何公共端点,因此与之通信的唯一方法是通过数据库本身。
现在,我想构建一个独立的Web应用程序,该网站将使用前面提到的MongoDB数据库中的可用数据。这些数据大多数应实时显示给用户。经过一些框架研究,我正在考虑使用Meteor,但找不到有关它是否与现有服务良好集成的有用信息。
所以实际的问题是:我可以在直接和外部使用MongoDB数据库的同时,受益于Meteor的框架,特别是受益于所有实时客户端数据更新吗?
例如,如果我在网站上显示“玩家”表,并且添加了新玩家或在外部MongoDB数据库中直接直接更新了玩家的分数 ,Meteor能否在所有已打开网站的客户中更新分数,还是此要求会使Meteor不适合我的项目?
答案 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应用程序听了它的声音,并“实时”(或用户认为是实时的)向客户端显示数据。
但是,这里有一些陷阱,很高兴提前知道它们。
Meteor创建的文档的字符串类型为_id
,而不是Mongo.ObjectID
。但是它可以读取和写入if you use it correctly。
Meteor使用own API包装集合,该集合将集合与其基于fibers
的环境最好地集成在一起。如果您需要使用其他功能,请阅读here和here。
Returned cursors的行为略有不同,但是与Collections一样,如果您从rawCollection
再次检查您在集合上使用的数据类型。例如,坚持使用相同的日期类型(例如ISODate),因此更新后不会出现意外错误。 mongoose
还有一个流星副本,名为simpl-schema
(npm 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)。但是,如果您发现这里没有提到的例外情况,请随时发表评论,因为这对其他用户也可能很重要。