【问题标题】:Cannot populate Mongoose schema from req.body无法从 req.body 填充 Mongoose 架构
【发布时间】: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


    【解决方案1】:

    您对架构中天数和数据天数的定义是不同的:

    所有小写字母

    const weekSchema = new mongoose.Schema({
        monday: daySchema,
        tuesday: daySchema,
        wednesday: daySchema,
        thursday: daySchema,
        friday: daySchema,
        saturday: daySchema,
        sunday: daySchema,
    });
    

    并且在数据中第一个字母是大写的:

        "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"}
        ]},
        ...
    

    【讨论】:

    • 天哪,太明显了,我一点都没看到。谢谢!
    猜你喜欢
    • 1970-01-01
    • 2017-03-23
    • 2016-07-11
    • 2018-12-12
    • 1970-01-01
    • 2019-07-31
    • 2020-05-21
    • 1970-01-01
    • 2012-01-22
    相关资源
    最近更新 更多