【问题标题】:Loading Data from MongoDB and using cursorstream for Visualization从 MongoDB 加载数据并使用 cursorstream 进行可视化
【发布时间】:2013-09-29 12:10:38
【问题描述】:

我想访问 MongoDB 中的实时数据,这些数据将在线更新以使用 javascript 进行地图和图形可视化。我尝试使用 cursorstream 遵循 MongoDB 网站中的示例。代码如下所示。根据示例,这应该可以工作,但是节点无法识别 .stream() 部分...

    var databaseUrl = "127.0.0.1/sensor_db2"; 

var collections = ["sensor"]
var db = require("mongojs").connect(databaseUrl, collections);


var stream = db.sensor.find().stream();

stream.on("data", function(item) {
    console.log(item);
});


stream.on('error', function (err) {
  console.error(err);
});

然后我收到这样的错误消息:

    /Users/user/Documents/nodetest/nodetest.js:6
var stream = db.sensor.find().stream();
                              ^
TypeError: Object [object Object] has no method 'stream'
    at Object.<anonymous> (/Users/user/Documents/nodetest/nodetest.js:6:35)
    at Module._compile (module.js:456:26)
    at Object.Module._extensions..js (module.js:474:10)
    at Module.load (module.js:356:32)
    at Function.Module._load (module.js:312:12)
    at Function.Module.runMain (module.js:497:10)
    at startup (node.js:119:16)
    at node.js:901:3
/Users/user/Documents/nodetest/nodetest.js:6
var stream = db.sensor.find().stream();
                              ^
TypeError: Object [object Object] has no method 'stream'
    at Object.<anonymous> (/Users/user/Documents/nodetest/nodetest.js:6:35)
    at Module._compile (module.js:456:26)
    at Object.Module._extensions..js (module.js:474:10)
    at Module.load (module.js:356:32)
    at Function.Module._load (module.js:312:12)
    at Function.Module.runMain (module.js:497:10)
    at startup (node.js:119:16)
    at node.js:901:3
BlackBook:nodetest user$ node nodetest.js

我使用 node.js 运行它。

任何人都可以帮助它有什么问题吗?有没有其他方法可以实现相同的目标? (从 mongodb 加载数据并在实时图表中可视化数据)?

【问题讨论】:

  • 您使用的是上限集合吗?
  • 不,我没有使用上限集合。
  • 我们是否应该在存储数据时使用上限集合以使其正常工作?
  • 好吧,如果您使用上限集合,那么您可以做您想做的事情。我不确定如何在无上限的收藏中进行处理。我会把封顶的收集方法作为答案,如果这对你没有用..我会删除它。

标签: javascript node.js mongodb real-time data-visualization


【解决方案1】:

我以前没有使用过 mongojs,但看起来您尝试使用本地 mongo 驱动程序跨流,该驱动程序在集合上提供 .stream() 函数,而 mongojs 似乎以稍微不同的方式提供它。从 mongojs 的 git hub 页面看起来你可以完成你想要做的事情。

https://github.com/mafintosh/mongojs#streaming-cursors

首先 npm 安装 JSONStream

var mongojs = require('mongojs');
var JSONStream = require('JSONStream');

var db = mongojs.connect(databaseUrl, collections);
// pipe all documents in mycollection to stdout
db.sensor.find({}).pipe(JSONStream.stringify()).pipe(process.stdout);

我在我的数据库上的一个集合上运行它并且它有效。祝你好运。希望它有所帮助。

【讨论】:

  • 我尝试所有步骤 npm install JSON stream,然后按照示例修改代码。运行脚本时,我收到错误消息:“对象传感器没有方法 'forEach'”。我的收藏(传感器)包含几个数据集。这个错误与它有关吗?
【解决方案2】:

首先,您收到该错误的原因是您尝试使用的 .stream() 。正如前面的答案所暗示的那样,您可以使用 .pipe()。

但是,根据我阅读的内容,您希望启动这个小脚本并能够将新插入内容捕获到集合中。您可以使用上限集合相对轻松地做到这一点。

要将非上限集合转换为上限集合,您发出的命令如下:

> db.runCommand({"convertToCapped": "sensor", size: 100000});

size 参数是以字节为单位的大小。使用上限集合的原因是它们是可追踪的;因此,当新文档插入数据库时​​,您可以检索它们。

因此,使用上限集合,您应该能够执行以下操作:

var databaseUrl = "127.0.0.1/sensor_db2";
var collections = ["sensor"]
var db = require("mongojs").connect(databaseUrl, collections);


var stream = db.sensor.find({},{},{tailable:true, timeout:false});

stream.on("data", function(item) {
    console.log(item);
});


stream.on('error', function (err) {
  console.error(err);
});

您可以在 mongodb 文档页面 here 上找到有关上限集合的更多信息。还 来自 mongojs github 页面的可尾光标示例位于 here

我了解您没有使用上限集合,因此此答案可能不是您想要的答案;但是,如果您可以使用上限集合,我将其作为答案。

【讨论】:

    猜你喜欢
    • 2012-07-09
    • 2017-10-19
    • 2021-09-18
    • 2018-10-23
    • 1970-01-01
    • 1970-01-01
    • 2013-07-16
    • 1970-01-01
    • 2014-05-26
    相关资源
    最近更新 更多