【问题标题】:Mongoose returns empy object, works in mongo shellMongoose 返回空对象,在 mongo shell 中工作
【发布时间】:2014-03-21 06:28:55
【问题描述】:

我正在尝试使用 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 对象,但是当我在我的节点应用程序中使用它时,控制台会吐出一个 empty对象。

20 Feb 11:47:06 - [nodemon] restarting due to changes...
20 Feb 11:47:06 - [nodemon] starting `node app.js`
[]

感谢您的所有帮助,非常感谢。我正在缓慢但肯定地到达那里 :)


编辑 1

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

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 }  
[]

【问题讨论】:

    标签: json node.js mongodb express mongoose


    【解决方案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)})
    });
    

    【讨论】:

    • 我也试过你的方法,在connect上使用回调,但我仍然有一个空对象[]
    • 我刚刚从您的 EDIT 1 运行了确切的代码,并且在控制台中得到了一个非空数组。所以代码很好。请分享您获得正确结果的 mongo shell 输出
    • nabeel,谢谢...我更改了我的帖子,请阅读我的 EDIT 2 和“控制台输出”
    • 添加了 EDIT 3,这与 mongo 没有在正确的集合中查找有关(团队 vs 团队)
    • 这就是问题所在。当您执行 mongoose.model('Team', teamSchema) 时,它会映射到数据库中名为“teams”而不是“Team”的集合。我猜这是猫鼬的约定。
    【解决方案2】:

    尝试改变

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

    通常我会采取不同的方式,但我认为这种方式可以帮助您....

    【讨论】:

    • 我仍然得到一个空对象 []
    • 我找到了这个参考goo.gl/dJbHzd 它显示了你的例子。我认为如果您在创建 Schema 之前连接是很好的工作机会。
    猜你喜欢
    • 2016-07-14
    • 1970-01-01
    • 2018-08-07
    • 1970-01-01
    • 2020-09-14
    • 2018-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多