代码之家  ›  专栏  ›  技术社区  ›  cprcrack

Meteor能正确处理外部直接更新到MongoDB数据库的数据吗?

  •  1
  • cprcrack  · 技术社区  · 8 年前

    上下文: 我已经有了一个nodejs服务器应用程序,它可以自主地读写MongoDB数据库。此服务没有任何公共端点,因此与之通信的唯一方法是通过数据库本身。

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

    所以实际问题是: 我能从Meteor的框架中获益吗,尤其是在直接和外部使用MongoDB数据库的同时,从所有实时客户端数据更新中获益?

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

    1 回复  |  直到 8 年前
        1
  •  2
  •   Jankapunkt    8 年前

    我能从流星的框架中获益吗,特别是从 实时客户端数据更新,同时直接和外部使用 MongoDB数据库?

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

    在生产中,您必须始终使用 MONGO_URL environment variable .

    奖励:您可以设置 蒙古文URL 即使在dev模式下,也可以连接到dev模式下的特定db。请注意,您可以在此数据库上堆积所有内容,小心使用。

    在引擎盖下流星使用节点Mongo驱动程序。您基本上能够使用这个驱动程序的所有API( see this post 有关如何调用本机Mongo方法的详细信息)

    例如,如果我在我的站点中显示一个“玩家”表,以及一个新的 添加玩家或从外部更新玩家的分数, 直接在基础MongoDB数据库中,Meteor是否能够 更新所有打开站点的客户机中的分数,或者 这个要求使流星不适合我的项目?

    有流星的 publication / subscription system 您基本上可以控制发布到客户机的数据。每次数据更改时都会运行发布(类似于观察者模式)。

    如果您的所有客户机都订阅了一个集合的数据,那么一旦集合更新,他们将获得更新。现在我们来看一下您最想要的特性:如果这个数据是由外部源更新的,那么这个特性也可以工作。

    它还具有非常快速的更新间隔。我在最近的一个项目中工作,在这个项目中,大量的数据通过一个MongoDB集合上的python进行了更新。Meteor应用程序听取了它的意见,并将数据以“实时”(或用户认为是实时的)的方式显示给客户。

    但是,也有一些陷阱,最好提前知道。

    1. Meteor创建文档时 _id 字符串类型而不是 Mongo.ObjectID . 但是它能够读写它 if you use it correctly .

    2. Meteor用 own API 将该系列与 fibers 基于环境。如果您需要使用其他功能,请阅读 here here .

    3. Returned cursors 行为稍有不同,但与集合一样,如果从 rawCollection

    4. 仔细检查您在集合中使用的数据类型。例如,坚持使用相同的日期类型(如isodate),这样在更新之后就不会出现意外错误。还有一颗流星对应于 mongoose 命名 simpl-schema ( npm package )这是保持收藏结构的好方法。

    总而言之,如果您考虑到Meteor指南和API文档的大部分内容,那么您应该有一个良好的跟踪,因为外部更新的集合的集成通常运行得很好,主要是为了了解pub/sub系统以使其运行。


    编辑:

    但是考虑到1号陷阱,如果流星使用自定义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中创建文档,则不必担心 圣婴 是一根绳子。

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