обновление массива вложенных документов в mongoose express

#node.js #express #mongoose #mongoose-schema

#node.js #экспресс #mongoose #mongoose-schema

Вопрос:

Итак, у меня есть схема, которая выглядит следующим образом:

 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 у меня будет только идентификатор пользователя и идентификатор турнира. Я хочу обновить paid players массив с 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)
    }
}
 

Где я ошибаюсь? и каким должен быть мой подход?

Ответ №1:

  • преобразуйте идентификатор строки из string в object type с помощью 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.