首页 > 解决方案 > 如何构建我的 Mongoose 模式以将用户的输入修补为数组中的对象?

问题描述

我的应用程序允许用户选择特定事件的日期。

每个“事件”文档都有一个“组”字段,其中包含一组对象,其中包含用户电子邮件和他们选择的日期。

我正在尝试在现有的“事件”文档中修补用户的日期输入。“事件”的架构如下:

const mongoose = require('mongoose')
const Schema = mongoose.Schema

const userDatesSchema = new Schema({
    email: {type:String},
    startDate: {type:String},
    endDate: {type:String},
},{
    timestamps: false
});

const eventSchema = new Schema({
    name: {type: String},
    group: [userDatesSchema]
}, {
    timestamps: true
})

以下是“事件”集合中的文档的样子:

_id:######################
   group:Array
      0:Object
         _id:#####################
         email:"testing@gmail.com"
         startDate:"2021-05-11T16:00:00.000Z"
         endDate:"2021-05-13T16:00:00.000Z"
name:"Event7"
createdAt:2021-05-07T00:51:17.704+00:00
updatedAt:2021-05-07T02:39:25.623+00:00
__v:0

用于修补用户选择的日期输入的 Mongoose 查询:

router.route('/update').patch((req,res)=>{
    const email = req.user.email;
    const startDate = req.body.startDate.startDate
    const endDate = req.body.endDate.endDate
    const userDates = {
        email,
        startDate,
        endDate
    }

Event.findOneAndUpdate({eventName: req.body.eventName}, {$push:{group: [userDates]}}, {new: true},(error, data)=>{
        if (error) {
            res.send(error);
            console.log("errt:", error)
          } else {
            res.send(data);
            console.log("result:", data)
          }
    })
})

不幸的是,当前设置此补丁的方式,每次都会创建一个新对象,从而导致单个用户的“组”字段中的日期有多个对象......

_id:######################
   group:Array
      0:Object
         _id:#####################
         email:"testing@gmail.com"
         startDate:"2021-05-11T16:00:00.000Z"
         endDate:"2021-05-13T16:00:00.000Z"
      1:Object
         _id:#####################
         email:"testing@gmail.com"
         startDate:"2021-06-19T16:00:00.000Z"
         endDate:"2021-06-22T16:00:00.000Z"
name:"Event7"
createdAt:2021-05-07T00:51:17.704+00:00
updatedAt:2021-05-07T02:39:25.623+00:00
__v:0

如何修补用户已存在的对象中的日期,而不是创建具有更新日期的新对象?

标签: node.jsmongodbobjectmongoosenested

解决方案


当前,您正在使用$push将新文档推送到数组中。我建议获取相关的事件文档并更新日期或将新的 userDates 添加到组数组中。


推荐阅读