我是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
in 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开发”一书
答案 0 :(得分:7)
解决问题的另一种方法是在模型中明确定义集合名称,即var Parking = mongoose.model('parking_info', parkingSchema, 'parking_info');
。如果未指定集合名称,则使用Mongoose约定。
请参阅:http://mongoosejs.com/docs/api.html#index_Mongoose-model
参数:
- 名称型号名称
- [架构]
- [collection] name(可选,从型号名称引出)
- [skipInit]是否跳过初始化(默认为false)
&#34;当没有传递集合参数时,Mongoose通过将模型名称传递给utils.toCollectionName方法来生成集合名称。该方法使名称复数化。如果您不喜欢此行为,请传递集合名称或设置模式集合名称选项。&#34;
答案 1 :(得分:0)
您需要一个对象作为Model的.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 });
}
});
});
参考:here
答案 2 :(得分:0)
当你这样做时会发生什么?
<h1>Parkings</h1>
{{#each parkings}}
<div class="parking">
<h3>{{_doc.STREETNAME}}</h3>
</div>
{{/each}}
更改后
res.render( "parkings", parkings);
要
res.render( "parkings", { parkings: parkings });
答案 3 :(得分:0)
我正在编写我的问题解决方案的评论:
问题是:我的收藏名为parking_info,在调试过程中我看到收藏名称为parking_infos - &gt;所以我将我的收藏品名称更改为parking_infos并且有效。
Sgni: - &gt; ORM(在这种情况下是mongoose),就像许多其他ORM一样,会使集合名称多元化。
就像惯例一样 - &gt;集合应该有多个名称