在Node.JS中寻找从MongoDB读取的帮助

时间:2011-04-02 22:13:14

标签: mongodb node.js

我有一些存储在MongoDB中的记录,我试图通过Node.JS http服务器将它们输出到浏览器窗口。我认为我是这方面很好的一部分,但是我错过了一些让它无法实际工作的小事。

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

如果周围有人可以帮助我在节点I中进行最后几次连接,我真的很感激。公平地说,我确信这只是一个开始。

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

编辑正确的代码

感谢下面的Mic让我朝着正确的方向前进。对于任何感兴趣的人,纠正的解决方案在这里:

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

4 个答案:

答案 0 :(得分:6)

我的猜测是你返回结果,编写响应,并在从数据库中取出任何内容之前关闭连接。

一种解决方案是将响应对象传递到您实际需要的位置,例如:

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

当然,您还应该处理错误并尽量避免嵌套太多级别,但这是一个不同的讨论。

答案 1 :(得分:1)

答案 2 :(得分:1)

您可能也想尝试mongoskin

答案 3 :(得分:0)

阅读文件

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

SELECT * FROM Table1 WHERE name = 'ABC'

相当于MongoDB中的以下内容(Collection1注意Table1):

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

我们可以链接count()以获取结果数量pretty()以获得可读结果。通过添加其他参数可以进一步缩小结果:

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

默认情况下,注意这些过滤器是 AND 一起非常重要。要应用 OR 过滤器,我们需要使用$or。将根据文档的结构指定这些过滤器。例如:对于对象name的对象属性school,我们需要指定像"school.name" = 'AUHS'

这样的过滤器

我们在此处使用 DOT 表示法,尝试访问字段name的嵌套字段school。另请注意,过滤器引用,否则我们会收到语法错误。

可以执行阵列上的等式匹配:

  • 关于整个数组
  • 基于任何元素
  • 基于特定元素
  • 使用运算符的更复杂匹配

在以下查询中:

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

MongoDB将通过与一个或多个值的数组完全匹配来识别文档。现在,对于这些类型的查询,元素的顺序很重要,这意味着我们只会匹配ABC之后XYZ 跟随的文档和那些是数组name

仅2 元素

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

在上面的文档中,我们要说我们需要获得ABC是第一个元素的所有文档。因此,我们将使用以下过滤器:

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