【问题标题】:updating subdocument array in mongoose express在猫鼬快递中更新子文档数组
【发布时间】:2021-03-09 05:46:30
【问题描述】:

所以我有一个架构,是这样的:

const playerSchema = new Schema(
      {
        user: {
          type: Schema.Types.ObjectId,
          ref: 'user'
        },
        paid : {type: Boolean, default: false}
      }
    )
const tournamentSchema = new Schema(
  {
    name: {
      type: String,
      required: true
    },
    player:[ playerSchema])

所以在锦标赛模型中我得到这个作为回报:

{
 "_id": "5fbf3afe1ecd92296c746db6",
 "name": "1st Testing Tournament",
 "player": [
        {
            "paid": false,
            "_id": "5fbf3cfe6347784028da8181",
            "user": "5fbf3b4c1ecd92296c746dcd"
        }
    ]}

在 API 中,我将只有用户 ID 和锦标赛 ID。我想将 players 数组中的 paid 从 false 更新为 true。这是我尝试过的:

exports.put_confirmPayment= async(req, res)=>{
    const uid = req.params.user_id
    const tid = req.params.tid
    const findData= {"_id": tid, "player.user": uid  }
    const changeData = {"player.$.paid": "true"}
    try {
        await Tournament.findOneAndUpdate( findData, {$set: {changeData}} )
        const tDB = await Tournament.findById(tid)
        res.status(200).json(tDB)
    } catch (error) {
        console.log(error)
        res.status(500).json(error.message)
    }
}

我哪里出错了?我的方法应该是什么?

【问题讨论】:

    标签: node.js express mongoose mongoose-schema


    【解决方案1】:
    • 使用mongoose.Types.ObjectId将字符串id从字符串转换为对象类型
    • 将“true”字符串更改为布尔值 true
    • 使用returnOriginal: falsenew: true 返回更新的结果都将返回新的更新结果
    • 已删除额外的常量变量,不要创建太多变量
    exports.put_confirmPayment = async(req, res) => {
    
        try {
            const tDB = await Tournament.findOneAndUpdate(
              { 
                _id: mongoose.Types.ObjectId(req.params.tid), 
                "player.user": mongoose.Types.ObjectId(req.params.user_id) 
              }, 
              { $set: { "player.$.paid": true } },
              { returnOriginal: false }
            );
            res.status(200).json(tDB);
        } catch (error) {
            console.log(error);
            res.status(500).json(error.message);
        }
    
    }
    

    Playground

    有关更多信息,请参阅 mongoose findoneandupdate 文档。

    【讨论】:

      猜你喜欢
      • 2020-08-05
      • 2015-06-03
      • 1970-01-01
      • 1970-01-01
      • 2021-06-30
      • 1970-01-01
      • 2012-02-15
      • 2015-04-21
      • 2022-08-18
      相关资源
      最近更新 更多