Обновление значения элемента вложенного массива в Mon go DB - PullRequest
0 голосов
/ 28 мая 2020

Я новичок в MERN, я создал систему, чтобы учителя проверяли задания. Моя схема выглядит так

const mongoose = require('mongoose')
const xyzSchema = new mongoose.Schema({
    user:{
        type:mongoose.Schema.Types.ObjectId,
        ref:'user_collections'
    },
    assignments:[{
        title_assignment:{
            type:String,
            required:true
        },
        description_assignment:{
            type:String,
            required:true
        },
        created_at:{
            type:Date,
            required:true,
            default:Date.now()
        },
        files:[],
        submitted:[{
            user:{
                type:mongoose.Schema.Types.ObjectId,
                ref:'user_collections'
            },
            files:[],
            created_at:{
                type:Date,
                required:true,
                default:Date.now()
            },
            checked:{
                type:Boolean,
                default:false
            }
        }],
        due_dt:{
            type:Date,
            required:true
        }
    }],
})

module.exports = mongoose.model('abc',xyzSchema)

При нажатии проверено на веб-интерфейсе, я не хочу обновлять значение «checked» с «false» на true.

Мой маршрут выглядит так

router.put('/assignments/check',
auth,
async(req,res)=>{
   
    try {
        let check = await Classroom.findOne(
            {"assignments._id":req.body.assignment_id,"assignments.submitted.user":req.body.user_id},
            {$set:{"assignments.$.submitted.$.checked":"true"}}} 
        )
        res.json(check)
    } catch (error) {
        console.error(error)
    }
})

Этот код у меня не работает. Кто-нибудь может мне что-нибудь предложить? Что я хочу сделать, так это 1) Найти назначение с использованием идентификатора и переданного массива назначений с использованием идентификатора пользователя внутри него 2) Измените значение "checked" для этого пользователя на "true"

1 Ответ

1 голос
/ 28 мая 2020

Вам необходимо использовать идентификатор $[]. С arrayFilters в update.

https://docs.mongodb.com/manual/reference/operator/update/positional-filtered/#up. S [% 3Cidentifier% 3E]

Вам также необходимо преобразовать свои идентификаторы в Идентификаторы объектов Mongodb с mongoose.Types.ObjectId(), если идентификаторы являются ObjectIds, в противном случае запрос может работать без ошибок, но поля не будут обновляться.

let check = await Classroom.update(
            {},
            { $set: {"assignments.$[assign].submitted.$[submitt].checked": "true" }},
            {
             arrayFilters: [
                  {
                     "assign._id": mongoose.Types.ObjectId(req.body.assignment_id)
                  },
                  {
                     "submitt.user": mongoose.Types.ObjectId(req.body.user_id)
                  }
               ]
            }

Идентификатор $ работает только для 1 уровня глубина, если больше то нужно использовать arrayFilters

...