0

我想访问 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 加载数据并在实时图表中可视化数据)?

4

2 回答 2

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);

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

于 2013-09-29T14:20:50.110 回答
0

首先,您收到该错误的原因是您尝试使用的 .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 文档页面上找到有关上限集合的更多信息。来自 mongojs github 页面的可尾光标示例也位于此处

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

于 2013-09-30T02:03:45.510 回答