首页 > 解决方案 > 在猫鼬快递中更新子文档数组

问题描述

所以我有一个模式,就像这样:

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。我想将数组从假更新为真paidplayers这是我尝试过的:

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.jsexpressmongoosemongoose-schema

解决方案


  • 使用将字符串 id 从字符串转换为对象类型mongoose.Types.ObjectId
  • 将“true”字符串更改为布尔值 true
  • 使用 返回更新的结果returnOriginal: false,或者new: 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);
    }

}

操场

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


推荐阅读