Нужна помощь с чтением из MongoDB в Node.JS - PullRequest
4 голосов
/ 03 апреля 2011

У меня есть несколько записей, хранящихся в MongoDB. Я пытаюсь вывести их в окно браузера через http-сервер Node.JS. Я думаю, что я проделал большую часть пути, но мне не хватает нескольких мелочей, которые мешают ему реально работать.

Код ниже использует 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');

Источники: - код подключения Монго: https://github.com/christkv/node-mongodb-native/blob/master/examples/simple.js узел. http код: nodejs.org

РЕДАКТИРОВАТЬ ИСПРАВЛЕННЫЙ КОД

Спасибо Мику ниже, который заставил меня катиться в правильном направлении. Для всех интересующихся, исправленное решение здесь:

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 ]

6 голосов
/ 03 апреля 2011

Я предполагаю, что вы возвращаете результат, записываете ответ и закрываете соединение до того, как что-либо будет извлечено из базы данных.

Одним из решений будет передача объекта ответа туда, где он вам действительно нуженчто-то вроде:

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 голос
/ 08 апреля 2011

Возможно, вы захотите попробовать mongoskin .

1 голос
/ 05 апреля 2011

Вместо написания всего низкоуровневого кода доступа Mongodb вы можете попробовать простую библиотеку, такую ​​как mongous , чтобы вы могли сосредоточиться на своих данных, а не на причудах MongoDB.

0 голосов
/ 29 августа 2016

Чтение документов

Чтобы применить фильтры определенных значений, мы можем передать конкретные значения команде 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})

Важно отметить, что по умолчанию эти фильтры И объединены. Чтобы применить фильтр ИЛИ , нам нужно использовать $or. Эти фильтры будут указаны в зависимости от структуры документа. Пример: для атрибута объекта name для объекта school нам нужно указать фильтр, например "school.name" = 'AUHS'

Здесь мы используем обозначение DOT , пытаясь получить доступ к вложенному полю name поля school. Также обратите внимание, что фильтры заключены в кавычки , без которых мы получим синтаксические ошибки.

Может быть выполнено совпадение равенства для массивов:

  • на всех массивах
  • на основе любого элемента
  • на основе конкретного элемента
  • более сложные совпадения с использованием операторов

В следующем запросе:

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

MongoDB собирается идентифицировать документы по точному совпадению с массивом из одного или нескольких значений. Теперь для этих типов запросов важен порядок элементов, что означает, что мы будем сопоставлять только те документы, которые имеют ABC с последующими и XYZ, а только 2 элементов массива name


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

В приведенном выше документе предположим, что нам нужно получить все документы, где ABC - первый элемент. Итак, мы будем использовать следующий фильтр:

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...