我们本周开始使用Meteor,非常渴望将它用于我们未来的项目。
虽然我们今天下午遇到了一块石头,但在我们的生态系统中,我们需要能够从外部节点/流星处理和插入mongodb内的数据。
我们的两个主要解决方案是在Hbase集群中使用MapReduce,以及解析CSV文件并在MongoDB中插入结果的python脚本。
现在,我可以在Meteor应用程序中使用MongoDB数据的唯一方法是通过Meteor(控制台或表单)添加数据。
让我们举一个简单的例子,我希望能够通过_id访问帖子。 Iron Router工作正常,并提供帮助来构建URL。有了相同的助手,我可以从三种不同的用法中找到两种不同的结果。
ObjectId似乎是错误的,这是我之前遇到的三种情况:
http://0.0.0.0:3000/post/PAXEqRBB7RiNrdTTT => Inserted by Meteor, works fine
http://0.0.0.0:3000/post/ObjectId(526fe0701d41c894b9105bff) => Inserted by python, broken
http://0.0.0.0:3000/post/ObjectId(526fe0701d41c894b8715bff) => Inserted with meteor mongo shell
所以我不能通过除了流星之外的东西访问MongoDB中插入的任何内容。
我在Github上发现了一些相关的问题,主要是这个问题:
https://github.com/meteor/meteor/issues/61
但它在8个月前关闭了,因为修复工作在路线图中。我正在使用最新版本的流星(0.6.6.2),这似乎还没有修复。
我的问题是我能找到什么样的解决方法?我不能在Python中调用像Meteor ObjectID生成这样的JS方法,那么什么是最好的解决方案呢?
我应该使用Node DDP应用来处理MongoDB的所有外部插入吗?
答案 0 :(得分:5)
如果您希望直接与数据库进行交互,我不会提倡您正在采取的方法,这似乎基本上是通过一些连接中间件构建用于与数据库交互的API。
在我看来,你有两种选择。
这是最简单,最快捷的选择,因为几乎所有语言都有MongoDB绑定。如果您使用Mongo oplog设置Meteor,则会立即通过 Meteor's oplog observe driver 接收您对Mongo所做的更改。
这可能是做事的“正确”方式。它还具有允许您对服务器进行RPC调用而不仅仅是进行数据库更改的优点,因此您可以利用已经定义的所有 Meteor.methods 。你的应用。
See here ,这是一个非常简单的Python DDP客户端示例。您需要更进一步,以获得Javascript客户端看到的完整反应性..
更新:Meteor现在拥有一个成熟的DDP客户端,运行它的一种方法就是作为Node上普通Meteor服务器的一部分。您可以执行普通浏览器客户端执行的任何操作。例如,请参阅https://github.com/VirtualLab/cooperation-loadtest。
答案 1 :(得分:1)
默认情况下,Meteor会覆盖_id创建。字符串选项使这些id在控制台交互中更容易处理。我更喜欢它。你可以让你的外部插入包括一个id作为字符串,或设置你的meteor env使用对象id。
http://docs.meteor.com/#meteor_collection
...
idGeneration String
The method of generating the _id fields of new documents in this collection. Possible values:
'STRING': random strings
'MONGO': random Meteor.Collection.ObjectID values