【发布时间】:2021-02-28 01:58:14
【问题描述】:
我在 MongoDB 中处理复杂的数据结构,并使用 mongoose 处理服务器到数据库的通信。
在mongoose 我有一个这样定义的架构:
var mongoose = require('mongoose')
var Schema = mongoose.Schema;
const timePeriodSchema = new mongoose.Schema({
opensAt: {type: String, default: null},
closesAt: {type: String, default: null}
});
const daySchema = new mongoose.Schema({
closed: {type: Boolean, default: false},
hours: [timePeriodSchema]
});
const weekSchema = new mongoose.Schema({
monday: daySchema,
tuesday: daySchema,
wednesday: daySchema,
thursday: daySchema,
friday: daySchema,
saturday: daySchema,
sunday: daySchema,
});
const restaurantSchema = new mongoose.Schema({
userId: {
type: mongoose.Schema.Types.ObjectId,
required: false,
ref: 'User',
default: null
},
name: {
type: String,
required: true,
default: null
},
category: [String],
type: [String],
style: [String],
cuisine: [String],
customDescription: {
type: String,
required: false,
default: null
},
address: {
type: String,
required: true,
default: null
},
countryCode: {
type: String,
required: true,
default: null
},
services: [String],
photos: [Buffer],
openingHours: weekSchema,
phonePrefix: {
type: String,
required: true,
default: null
},
phoneNumber: {
type: String,
required: true,
default: null
},
website: {
type: String,
required: false,
default: null
},
reservationMethods: [String],
paymentMethods: [String],
createdAt: {
type: Date,
required: true,
default: Date.now,
}
});
module.exports = mongoose.model('Restaurant', restaurantSchema)
我尝试使用以下代码创建一个新餐厅:
saveRestaurant: function(req, res){
Restaurant.findOne({
address: req.body.address
}, function(err, restaurant){
if(err) throw err;
if(restaurant){
return res.status(500).send({success: false, key: 'addressUsed', title: res.__('requestFailedTitle'), msg: res.__('restaurantSaveAlreadyExistsErrorMsg')});
}else{
User.findOne({
email: req.body.userEmail
}, function (err, user){
if(err){
throw err
}
if(user){
var restaurant = new Restaurant(req.body);
restaurant.userId = user._id;
restaurant.save(function(err, restaurant){
if(err) throw err;
});
return res.status(200).send({success: true, msg: res.__('saveSuccessResponse')});
}
});
}
});
}
这是服务器接收到的req.body 的示例:
{
"userEmail": "example@gmail.com",
"name": "My Restaurant",
"category": [ "Café", "Pub" ],
"type": [ "Ethnic Restaurant", "Fine Dining Restaurant" ],
"style": [ "Elegant" ],
"cuisine": [ "Haute" ],
"customDescription": "This is a custom description",
"address": "Piazza di Spagna, Piazza di Spagna, Rome, Metropolitan City of Rome, Italy",
"countryCode": "IT",
"services": [ "Handicap", "Restroom" ],
"photos": [],
"openingHours": {
"Monday": { "closed": true, "hours": [
{"opensAt": "11:00", "closesAt": "17:00"}
]},
"Tuesday": { "closed": true, "hours": [
{"opensAt": "11:00", "closesAt": "17:00"}
]},
"Wednesday": { "closed": true, "hours": [
{"opensAt": "11:00", "closesAt": "17:00"}
]},
"Thursday": { "closed": true, "hours": [
{"opensAt": "11:00", "closesAt": "17:00"}
]},
"Friday": { "closed": true, "hours": [
{"opensAt": "11:00", "closesAt": "17:00"}
]},
"Saturday": { "closed": true, "hours": [
{"opensAt": "11:00", "closesAt": "17:00"}
]},
"Sunday": { "closed": true, "hours": [
{"opensAt": "11:00", "closesAt": "17:00"}
]}
},
"phonePrefix": "+39",
"phoneNumber": "1234567890",
"website": "asdfg.it",
"reservationMethods": [ "Phone" ],
"paymentMethods": [ "Cash", "Card" ]
}
问题是创建的餐厅的所有字段都设置得很完美,除了嵌套的 openingHours 字段。
在openingHours 字段中,仅存储对象的_id,没有其他内容。
mongoose 似乎无法检索和填充嵌套架构。
但是我已经读到它显然应该能够。有人知道我做错了什么吗?
我不想使用单独的集合并通过_id 链接它们,因为这会导致太多无用的集合;我想把所有东西都放在同一个集合中。
下面是 MongoDB 中实际保存的截图:
【问题讨论】:
标签: node.js mongodb mongoose mongoose-schema