【发布时间】:2016-07-23 03:50:28
【问题描述】:
我有以下情况:我有一个使用 MongoDB 的 Node.js 应用程序,因此使用 Docker Compose 我可以拥有两个容器:一个用于 Node 应用程序,另一个用于 MongoDB。
现在,该应用必须支持以下功能:可以上传csv 文件,该文件将使用mongoimport 导入Mongo。
使用 Node,运行 mongoimport 很容易,因为我们有 exec 函数。也就是说,这将是一个问题:
const exec = require('child_process').exec;
exec('mongoimport -d database -c collection --type csv file.csv', function (error, stdout, stderr) {
// Other stuff here...
});
唯一的问题是:mongoimport 将不可用,因为 MongoDB 位于 Node 应用程序之外的另一个容器中!
现在如何解决这个问题?我想通过 exec 使用 ssh 在 Mongo 容器上运行它,但我不确定。
如何将 Node 应用程序中的 mongoimport 运行到 Mongo 容器中?
【问题讨论】:
-
您可以在 Node.js 容器中安装 mongo 工具/客户端以使用 mongoimport 并指定 MongoDB 主机。但似乎没有 exec 的基于节点的解决方案可能更干净。部分取决于您对 csv 数据的处理方式以及这些文件的性质(大小、复杂性等)。
-
出于效率考虑,我一直在避免使用基于节点的解决方案。我正在导入一个包含 25 万行或更多行的文件。使用 mongoimport 几乎可以立即导入数据,而使用 Node.js 则需要一些时间。现在,要安装这些 mongo 工具,我需要在 dockerfile 中添加一些
apt-get语句,对吗? -
是的 - 如果工作很繁重,另一种方法是为它创建一个服务,即另一个与 Node 应用程序共享卷的容器(以便它可以获取文件)和一个构建规范(Dockerfile),包括 mongoimport 和一个允许您与 Node 应用程序(http 或 pub/sub 等)通信的小应用程序。这个模型很好,因为您可以从主应用程序以及数据库中抽象出实际功能(mongoimport,等等)。
-
感谢@Idg 的评论,我喜欢你建议的这个解决方案。您提到的
http方式是创建一个简单的Web api,它等待特定端点中的请求,并在此类请求中使用卷上的数据执行导入,对吗?现在,我已经阅读了一些关于 pub/sub 的信息,但从未有机会在实践中看到它,因此我想了解如何使用 pub/sub 来做到这一点。你能告诉我这将如何进行吗?我该如何开始使用它来实施这个解决方案? -
添加为答案,包括更多详细信息以回答您的上述问题。