Besoin d’aide pour lire de MongoDB dans Node.JS

Un certain nombre d’enregistrements sont stockés dans une MongoDB. J’essaie de les exporter dans la fenêtre du navigateur via un serveur http Node.JS. Je pense que je suis un bon bout du chemin, mais il me manque quelques petites choses qui l’empêchent de fonctionner.

Le code ci-dessous utilise node-mongo-native pour se connecter à la firebase database.

S’il y a quelqu’un autour de moi qui peut m’aider à établir ces dernières connexions avec le travail dans noeud, je l’apprécierais vraiment. Pour être juste, je suis sûr que ce n’est que le début.

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

Sources: – Code de connectivité Mongo: https://github.com/christkv/node-mongodb-native/blob/master/examples/simple.js – noeud. code http: nodejs.org

MODIFIER LE CODE CORRIGÉ

Merci à Mic ci-dessous qui m’a fait avancer dans la bonne direction. Pour les personnes intéressées, la solution corrigée est la suivante:

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

J’imagine que vous renvoyez le résultat, écrivez la réponse et fermez la connexion avant que quoi que ce soit ne soit extrait de la firebase database.

Une solution serait de transmettre l’object de réponse là où vous en avez réellement besoin, par exemple:

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

Bien sûr, vous devez également gérer les erreurs et éviter d’emboîter trop de niveaux, mais la discussion est différente.

Au lieu d’écrire tout le code d’access Mongodb de bas niveau, vous pouvez essayer une bibliothèque simple, comme mongous, pour pouvoir vous concentrer sur vos données et non sur les défauts de MongoDB.

Vous voudrez peut-être essayer mongoskin aussi.

Lecture de documents

Pour appliquer des filtres de valeur spécifiques, nous pouvons transmettre des valeurs spécifiques à la commande find() . Voici une requête SQL:

SELECT * FROM Table1 WHERE name = 'ABC'

ce qui équivaut à ce qui suit dans MongoDB (notice Collection1 for Table1 ):

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

Nous pouvons chaîner count() pour obtenir le nombre de résultats, pretty() pour obtenir un résultat lisible. Les résultats peuvent être encore affinés en ajoutant des parameters supplémentaires:

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

Il est important de noter que ces filtres sont ET édités ensemble, par défaut. Pour appliquer un filtre OR , nous devons utiliser $or . Ces filtres seront spécifiés en fonction de la structure du document. Ex: pour le name atsortingbut d’object pour une school object, nous devons spécifier un filtre comme "school.name" = 'AUHS'

Nous utilisons ici la notation DOT , en essayant d’accéder à un name de champ nested d’une school terrain. Notez également que les filtres sont cités , sans quoi nous aurons des erreurs de syntaxe.

Les matchs d’égalité sur les tableaux peuvent être effectués:

  • sur les tableaux entiers
  • basé sur n’importe quel élément
  • basé sur un élément spécifique
  • correspondances plus complexes en utilisant des opérateurs

Dans la requête ci-dessous:

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

MongoDB va identifier les documents en faisant une correspondance exacte avec un tableau d’une ou plusieurs valeurs. Maintenant, pour ces types de requêtes, l’ ordre des éléments est important, ce qui signifie que nous ne ferons correspondre que les documents dont ABC suivi de XYZ et que ce sont les 2 seuls éléments du name du tableau

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

Dans le document ci-dessus, supposons que nous ayons besoin de tous les documents où ABC est le premier élément. Nous allons donc utiliser le filtre ci-dessous:

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