#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.