NodeJS + MongoDB + Express – 查询不带任何结果

被NodeJS + MongoDB + Express堆栈搞乱了,遇到了执行查询的问题。 我有我的index.js文件中的一些辅助方法:

var mongoClient = new MongoClient(new Server(mongoHost, mongoPort)); //B mongoClient.open(function(err, mongoClient) { //C if (!mongoClient) { console.error("Error! Exiting... Must start MongoDB first"); process.exit(1); //D } var db = mongoClient.db("trackr"); //E collectionDriver = new CollectionDriver(db); //F }); app.use(express.static(path.join(__dirname, 'public'))); app.get('/:collection', function(req, res) { //A var params = req.params; //B collectionDriver.findAll(req.params.collection, function(error, objs) { //C if (error) { res.send(400, error); } //D else { if (req.accepts('html')) { //E res.render('data',{objects: objs, collection: req.params.collection}); //F } else { res.set('Content-Type','application/json'); //G res.send(200, objs); //H } } }); }); app.get('/:collection/:entity', function(req, res) { //I var params = req.params; var entity = params.entity; var collection = params.collection; if (entity) { collectionDriver.get(collection, entity, function(error, objs) { //J if (error) { res.send(400, error); } else { res.send(200, objs); } //K }); } else { res.send(400, {error: 'bad url', url: req.url}); } }); app.get('/:collection/iata/:value', function(req, res) { //I console.log("entrou"); var params = req.params; var value = params.value; var collection = params.collection; if (value) { collectionDriver.getByIata(collection, value, function(error, objs) { //J if (error) { res.send(400, error); } else { res.send(200, objs); } //K }); } else { res.send(400, {error: 'bad url', url: req.url}); } }); 

这里的问题是 – 每当我通过GET请求指向“/ collection /”路由,一切正常 – 集合中的所有项目都被渲染。 另外,如果我指向“/ collection / entity”路由,通过提供一个ObjectID,特定的项目也被返回。 而当我尝试GET请求的/收集/ iata /值,没有对象返回。 但是,当我在MongoDB提示中执行相同的查询时,文档将成功返回。

整个收集查询

collection_query

按ObjectID查询

query_objectID

由IATA文件属性查询

query_iata

直接通过MongoDB提示查询

query_mongo

在我的index.js中,我从下面的代码摘录中调用了collectionDriver.js中的函数:

  CollectionDriver.prototype.findAll = function(collectionName, callback) { this.getCollection(collectionName, function(error, the_collection) { //A if( error ) callback(error); else { the_collection.find().toArray(function(error, results) { //B if( error ) callback(error); else callback(null, results); }); } }); }; CollectionDriver.prototype.get = function(collectionName, param, callback) { //A console.log("Get by ObjectID"); this.getCollection(collectionName, function(error, the_collection) { if (error) callback(error); else { var checkForHexRegExp = new RegExp("^[0-9a-fA-F]{24}$"); //B if (!checkForHexRegExp.test(param)) callback({error: "invalid id"}); else the_collection.findOne({'_id':ObjectID(param)}, function(error,doc) { //C if (error) callback(error); else callback(null, doc); }); } }); }; CollectionDriver.prototype.getByIata = function(collectionName, attribute, callback) { //A console.log('entrou no driver - encontrar por atributo - collectionName: ' + collectionName); this.db.collection(collectionName, function(error, the_collection) { if( error ) callback(error); else the_collection.find({'iata': attribute}, function(error, collection) { collection.count({}, function(error, numDocs){ console.log(numDocs); }); }); }); }; 

我知道ObjectID查询需要转换为BSON – 当我试图查询文档的属性时是否缺less一些类似的要求?

提前致谢。

你不会从getByIata原型返回任何东西

 CollectionDriver.prototype.getByIata = function(collectionName, attribute, callback) { //A console.log('entrou no driver - encontrar por atributo - collectionName: ' + collectionName); this.db.collection(collectionName, function(error, the_collection) { if( error ) callback(error); else the_collection.find({'iata': attribute}, function(error, doc) { if (error) callback(error); else callback(null, doc); }); }); };