【问题标题】:mongoose returns empty array on querying mongolab database/mongoose 在查询 mongolab 数据库时返回空数组/
【发布时间】:2015-08-12 04:07:30
【问题描述】:

我是 mongodb 和 mongoose 的新手,我正在尝试按照一本书来学习它。我在 mongolab 上有一个名为“firstdatabase”的现有数据库,其中有一个名为“parking_info”的集合,这是该集合中的一条记录:

{
    "_id": {
        "$oid": "559c152fa439a961c357f931"
    },
    "POST_ID": "354-20160",
    "MS_ID": "-",
    "MS_SPACEID": 0,
    "CAP_COLOR": "Grey",
    "METER_TYPE": "SS",
    "SMART_METE": "Y",
    "ACTIVESENS": "N",
    "JURISDICTI": "SFMTA",
    "ON_OFF_STR": "ON",
    "OSP_ID": 0,
    "STREET_NUM": 2016,
    "STREETNAME": "CHESTNUT ST",
    "STREET_SEG": 3977000,
    "RATEAREA": "Area 5",
    "SFPARKAREA": "Marina",
    "LOCATION": {
        "type": "Point",
        "coordinates": [
            37.8007983983,
            -122.4368696024
        ]
    }
}

我正在尝试在使用 mongoose 的 nodejs 应用程序中使用此数据库。这是我的目录结构:

>models
-->parking.js
>views
-->parkings.handlebars
>credentials.ja
>app.js

在parking.js --> 我正在创建架构。

// mongoose scehma
var mongoose = require('mongoose');
var parkingSchema = mongoose.Schema({
    "POST_ID": String,
    "MS_ID": String,
    "MS_SPACEID": Number,
    "CAP_COLOR": String,
    "METER_TYPE": String,
    "SMART_METE": String,
    "ACTIVESENS": String,
    "JURISDICTI": String,
    "ON_OFF_STR": String,
    "OSP_ID": Number,
    "STREET_NUM": Number,
    "STREETNAME": String,
    "STREET_SEG": Number,
    "RATEAREA": String,
    "SFPARKAREA": String,
    "LOCATION": {
        "type": String,
        "coordinates": [Number]
    }
});

var Parking = mongoose.model('parking_info', parkingSchema);
module.exports = Parking;

在我的 app.js 中有:

var mongoose = require('mongoose');
var Parking = require('./models/parking');

var opts = {
    server: {
        socketOptions: { keepAlive: 1 }
    }
};
switch(app.get('env')){
    case 'development':
        mongoose.connect(credentials.mongo.development.connectionString, opts);
        console.log('connected..to db');
        break;
    case 'production':
        mongoose.connect(credentials.mongo.production.connectionString, opts);
        break;
    default:
        throw new Error('Unknown execution environment: ' + app.get('env'));
}


app.get("/parkings", function(req, res){
    Parking.find(function(err, parkings){
        if(err){
            console.log('error..');
            return handleError(err);
        }
        else {
            console.log('returning parkings..');
            res.render( "parkings", parkings);
        }

    });

});

我正在尝试在parkings.handlebars 中显示数据

<h1>Parkings</h1>
{{#each parkings}}
    <div class="parking">
        <h3>{{STREETNAME}}</h3>

    </div>
{{/each}}

但是我的 Parking.find 返回一个空数组,有人可以帮我理解我哪里出错了。?我正在关注 Ethan Brown 的《使用 Node 和 Express 进行 Web 开发》

【问题讨论】:

  • 尝试在您的.find() 方法调用中再添加一个参数,这是一个带有供搜索使用的参数的对象,然后将您的回调函数作为第二个参数移动到.find()。尝试添加后mongoosejs.com/docs/api.html#model_Model.find

标签: node.js mongodb express mongoose mlab


【解决方案1】:

解决问题的另一种方法是在模型中明确定义集合名称,即var Parking = mongoose.model('parking_info', parkingSchema, 'parking_info');。如果未指定集合名称,则使用 Mongoose 约定。

见:http://mongoosejs.com/docs/api.html#index_Mongoose-model

参数:

  • 命名型号名称
  • [架构]
  • [collection] 名称(可选,由模型名称导出)
  • [skipInit] 是否跳过初始化(默认为false)

"当没有传递集合参数时,Mongoose 会通过将模型名称传递给 utils.toCollectionName 方法来生成集合名称。此方法将名称复数。如果您不喜欢这种行为,请传递集合命名或设置您的架构集合名称选项。”

【讨论】:

    【解决方案2】:

    您需要一个对象作为模型的.find() 方法调用的第一个参数。由于您想要集合中的所有内容,因此您可以传入一个空对象。

    app.get("/parkings", function(req, res){
        Parking.find({}, function(err, parkings){
            if(err){
                console.log('error..');
                return handleError(err);
            }
            else {
                console.log('returning parkings..');
                res.render( "parkings", { parkings: parkings });
            }
    
        });
    
    });
    

    参考:http://mongoosejs.com/docs/api.html#model_Model.find

    【讨论】:

    • @Sgni .. 感谢您的回复.. 我做到了,但仍然是一样的。
    • @swatisaoji 更新了我的评论,我更改了res.render 的选项。我设置了一个新的对象文字并将parkings 的键设置为parkings 的值,这是来自猫鼬查询的数据。
    • @Sgni 相同,实际上来自查询的数据是空数组。我使用调试器进行了检查。
    • 嘿@Sgni 我现在得到了数组,问题是我的集合名为parking_info,在调试期间我看到集合名称为parking_infos --> 所以我将集合名称更改为parking_infos 并且它有效。 .但我真的不知道背后的概念..必须对命名约定做一些事情..
    • 啊,是的! ORM(在这种情况下是 mongoose),像许多其他 ORM 一样会使集合名称复数。就像你说的那样,这是一个命名约定,而且是一个非常标准的约定。
    【解决方案3】:

    当你这样做时会发生什么?

    <h1>Parkings</h1>
    {{#each parkings}}
        <div class="parking">
            <h3>{{_doc.STREETNAME}}</h3>
    
        </div>
    {{/each}}
    

    更改后

    res.render( "parkings", parkings);
    

    res.render( "parkings", { parkings: parkings });
    

    【讨论】:

    • 是一样的。当我使用 res.send({ parks: parks });而不是渲染视图.. 我得到 {"parkings":[]} 实际上停车场是空数组。
    • @swatisaoji 编辑:检查了您对其他答案的其他评论。您已经对其进行了调试,发现它实际上返回了一个空数组?还是您只是基于空 HTML 假设?
    • --> 它是一个空数组。请检查我在其他答案中的评论-> 现在可以使用,感谢您的时间和帮助。我从答案和讨论中学到了很多。
    【解决方案4】:

    我正在编译解决我的问题的 cmets:

    问题是:我的集合名为parking_info,在调试过程中我看到集合名称为parking_infos --> 所以我将集合名称更改为parking_infos 并且它起作用了。

    Sgni : -> ORM(在这种情况下是 mongoose),像许多其他 ORM 一样,会将集合名称复数。

    所以就像约定一样->集合应该有复数名称

    【讨论】:

      猜你喜欢
      • 2018-06-12
      • 2019-11-30
      • 2015-04-18
      • 2014-10-21
      • 2019-08-29
      • 1970-01-01
      • 2022-12-22
      • 2019-10-27
      • 2017-11-13
      相关资源
      最近更新 更多