Mongoose返回空对象,在mongo shell中工作

时间:2014-02-20 10:59:03

标签: json node.js mongodb express mongoose

我正在尝试使用mongoose(最新版本)从我的mongoDB返回一个JSON对象。一切正常,但我得到一个空数组返回[]。

app.js

/*///////////////////////////////////////////////////////////////////////////////////////////////////////////
dependencies
///////////////////////////////////////////////////////////////////////////////////////////////////////////*/

    var express = require("express")
    var cons = require("consolidate")
    var app = express()

    var db = require("./model/db")

    var path = require("path")
    var routes = require("./routes/routes")

/*///////////////////////////////////////////////////////////////////////////////////////////////////////////
configure
///////////////////////////////////////////////////////////////////////////////////////////////////////////*/

    app.configure(function(){

        app.use(app.router)
        app.engine("html", cons.hogan)
        app.set("view engine", "html")
        app.set("views", __dirname + "/views")
        app.use(express.static(path.join(__dirname, "public")))
        app.use(express.errorHandler())

    })

/*///////////////////////////////////////////////////////////////////////////////////////////////////////////
routes
///////////////////////////////////////////////////////////////////////////////////////////////////////////*/

    app.get("/", routes.index)
    app.get("/hire", routes.hire)
    app.get("/hire/:id/:nr", routes.hirePerson)
    app.get("/books", routes.books)
    app.get("/projects", routes.projects)

/*///////////////////////////////////////////////////////////////////////////////////////////////////////////
listen
///////////////////////////////////////////////////////////////////////////////////////////////////////////*/

    app.listen(2020)

db.js

var mongoose = require('mongoose');

var teamSchema = new mongoose.Schema({
 country: String,
 GroupName: String
});

mongoose.model('Team', teamSchema);
mongoose.connect('mongodb://localhost/basingCOM');

var Team = mongoose.model('Team');
Team.find({"GroupName":"kevin"}, function (err, teams) {console.log(teams)})

这个.find方法在shell中运行,我得到了返回的json对象,但当我在我的节点应用程序中使用它时,控制台会吐出对象

20 Feb 11:47:06 - [nodemon] restarting due to changes...
20 Feb 11:47:06 - [nodemon] starting `node app.js`
[]
对于你所有帮助的人来说,真的很感激。我慢慢地,但肯定地到达那里:)


编辑1

我将db.js更改为此(使用下面的注释),但我仍然有一个空对象。

var mongoose = require('mongoose');

var teamSchema = new mongoose.Schema({
 country: String,
 GroupName: String
});

var teamModel = mongoose.model('Team', teamSchema);
mongoose.connect('mongodb://localhost/basingCOM', function(err){doDBstuff(err)});

function doDBstuff(err){

    if (err){throw err}

    console.log("jow")

    teamModel.find({"GroupName":"kevin"}, function (err, teams) {console.log(teams)});

}

编辑2

我创建了一个新架构(booksSchema),并使用booksModel而不是teamModel尝试了代码。输出是一个正确的JSON对象。所以它适用于booksModel,但不适用于teamModel。

var mongoose = require('mongoose');
mongoose.set('debug', true)

var teamSchema = new mongoose.Schema({
 country: String,
 GroupName: String
});

var booksSchema = new mongoose.Schema({
 title: String,
 author: String
});

var teamModel = mongoose.model('Team', teamSchema);
var booksModel = mongoose.model('books', booksSchema);


mongoose.connect('mongodb://localhost/basingCOM', function(err){doDBstuff(err)});

function doDBstuff(err){

    if (err){throw err}

    booksModel.find(function (err, books) {console.log(books)});

}

某些控制台输出:

> db.Team.find()
{ "_id" : ObjectId("5305d71aa753d02674ed311c"), "country" : "belgium", "GroupName" : "kevin" }
{ "_id" : ObjectId("5305d738a753d02674ed311d"), "country" : "holland", "GroupName" : "dave" }
> 

> db.Team.find({"GroupName":"kevin"}, function (err, teams) {console.log(teams)})
{ "_id" : ObjectId("5305d71aa753d02674ed311c"), "country" : "belgium", "GroupName" : "kevin" }

> 

编辑3

启用mongoose.set(“debug”,true)时,它显示mongo正在查找集合teams.find()而不是Team.find()中的数据。

20 Feb 13:46:29 - [nodemon] starting `node app.js`
Mongoose: teams.find({}) { fields: undefined }  
[]

2 个答案:

答案 0 :(得分:1)

我认为这是因为您在与MongoDB建立连接之前正在执行查询。 mongoose.connect是一个异步函数,您必须等待它的回调在您执行查询之前被调用。试试这样......

mongoose.connect('mongodb://localhost/basingCOM', function (err) {
    if (err) 
      throw err;

    console.log("Successfully connected to MongoDB");
    Team.find({"GroupName":"kevin"}, function (err, teams) {console.log(teams)})
});

答案 1 :(得分:0)

尝试更改

mongoose.model('Team', teamSchema);
mongoose.connect('mongodb://localhost/basingCOM');

var Team = mongoose.model('Team');
Team.find({"GroupName":"kevin"}, function (err, teams) {console.log(teams)})

var teamModel = mongoose.model('Team', teamSchema);
mongoose.connect('mongodb://localhost/basingCOM');

teamModel.find({"GroupName":"kevin"}, function (err, teams) {console.log(teams)});

通常情况下,我采取不同的方式,但我认为这种方式可以帮助你......