在Node.JS中寻找MongoDB的帮助

我有一些存储在MongoDB中的logging我试图通过Node.JS http服务器的方式输出到浏览器窗口。 我想我是一个很好的方式,但我错过了一些小事情,使它从实际工作。

下面的代码使用node-mongo-native连接到数据库。

如果有人可以帮我做最后几个连接节点,我真的很感激。 公平地说,我相信这只是一个开始。

var sys = require("sys"); var test = require("assert"); var http = require('http'); var Db = require('../lib/mongodb').Db, Connection = require('../lib/mongodb').Connection, Server = require('../lib/mongodb').Server, //BSON = require('../lib/mongodb').BSONPure; BSON = require('../lib/mongodb').BSONNative; var host = process.env['MONGO_NODE_DRIVER_HOST'] != null ? process.env['MONGO_NODE_DRIVER_HOST'] : 'localhost'; var port = process.env['MONGO_NODE_DRIVER_PORT'] != null ? process.env['MONGO_NODE_DRIVER_PORT'] : Connection.DEFAULT_PORT; sys.puts("Connecting to " + host + ":" + port); function PutItem(err, item){ var result = ""; if(item != null) { for (key in item) { result += key + '=' + item[key]; } } // sys.puts(sys.inspect(item)) // debug output return result; } function ReadTest(){ var db = new Db('mydb', new Server(host, port, {}), {native_parser:true}); var result = ""; db.open(function (err, db) { db.collection('test', function(err, collection) { collection.find(function (err, cursor){ cursor.each( function (err, item) { result += PutItem(err, item); }); }); }); }); return result; } http.createServer(function (req, res) { res.writeHead(200, {'Content-Type': 'text/plain'}); res.end("foo"+ReadTest()); }).listen(8124); console.log('Server running on 8124'); 

来源: – mongo连接代码: https : //github.com/christkv/node-mongodb-native/blob/master/examples/simple.js – 节点。 http代码:nodejs.org

编辑修正的代码

感谢下面的麦克风让我朝正确的方向滚动。 对于任何有兴趣的人来说,更正的解决scheme是

 function ReadTest(res){ var db = new Db('mydb', new Server(host, port, {}), {native_parser:true}); var result = ""; res.write("in readtest\n"); db.open(function (err, db) { res.write("now open\n"); db.collection('test', function(err, collection) { res.write("in collection\n"); collection.find(function (err, cursor){ res.write("found\n"); cursor.each( function (err, item) { res.write("now open\n"); var x = PutItem(err, item); sys.puts(x); res.write(x); if (item == null) { res.end('foo'); } }); }); }); }); } http.createServer(function (req, res) { res.writeHead(200, {'Content-Type': 'text/plain'}); res.write("start\n"); ReadTest(res); }).listen(8124); console.log('Server running on 8124'); 

我的猜测是,你正在返回结果,写入响应,并closures连接之前,从数据库中提取任何东西。

一种解决scheme是将响应对象传递到实际需要的地方,如:

 function readTest(res) { db.open(function (err, db) { db.collection('test', function(err, collection) { collection.find(function (err, cursor) { res.writeHead(200, {'Content-type' : 'text/plain'}); cursor.each( function (err, item) { res.write(item); }); res.end(); ... 

当然,你也应该处理错误,尽量避免嵌套太多的层次,但这是一个不同的讨论。

您可能不想编写所有底层Mongodb访问代码,而是尝试一个简单的库,例如mongous,这样您就可以专注于您的数据,而不是MongoDB怪癖。

你也可以试试蒙牛 。

阅读文件

要应用特定的值filter,我们可以将特定的值传递给find()命令。 这是一个SQL查询:

SELECT * FROM Table1 WHERE name = 'ABC'

这在MongoDB相当于以下内容(通知Table1 Collection1 ):

db.Collection1.find({name: 'ABC'})

我们可以链count()来得到结果的数量, pretty()得到一个可读的结果。 通过添加其他参数可以进一步缩小结果:

db.Collection1.find({name: 'ABC', rollNo: 5})

需要注意的是,默认情况下这些filter是在一起的。 要应用ORfilter,我们需要使用$or 。 这些filter将根据文档的结构来指定。 例如:对于对象school对象属性name ,我们需要指定filter,如"school.name" = 'AUHS'

我们在这里使用DOT符号,试图访问一个田间school的嵌套字段name 。 另外请注意,filter被引用 ,没有它,我们会得到语法错误。

数组上的相等匹配可以被执行:

  • 在整个arrays上
  • 基于任何元素
  • 基于特定的元素
  • 使用运算符更复杂的匹配

在下面的查询中:

db.Collection1.find({name: ['ABC','XYZ']})

MongoDB将通过与一个或多个值的数组精确匹配来识别文档。 现在对于这些types的查询,元素的顺序很重要,这意味着我们只匹配具有ABC 后跟 XYZ文档,而这些是数组name 唯一的2个元素

 {name:["ABC","GHI","XYZ"]}, {name:["DEF","ABC","XYZ"]} 

在上面的文档中,假设我们需要得到ABC是第一个元素的所有文档。 所以,我们将使用下面的filter:

db.Schools.find({'name.0': 'ABC' })