Обновить внутренний объект модели Mongo с идентификатором идентификатора

#node.js #mongodb

#node.js #mongodb

Вопрос:

Моя модель, которая имеет coure_name, c_material как массив, c_task как массив, и я пытаюсь получить результаты на основе приведенного ниже запроса:

 const taks_schema = mongoose.Schema({
    course_name : {
        type : String,
        required : true,
        unique : [true,  "Someone register using this email"],
        trim : true
    },
    c_material : [
        {
            m_name : {
                type : String
            },
            m_link : {
                type : String
            },
            m_file : {
                type : String
            },
            m_date : {
                type : String
            }
        }
    ],
    c_task : [
        {
            t_name : {
                type : String
            },
            t_details : {
                type : String
            },
            t_start_date : {
                type : Date
            },
            t_end_date : {
                type : Date
            },
            t_q_file : {
                type : String
            },
            t_s_file : [
                {
                    t_s_email: {
                        type : String
                    },
                    t_s_file_inner : {
                        type : Array
                    },
                    t_s_file_Date : {
                        type : Date
                    }
                }
            ]
        }
    ]
});
 

Я применяю этот запрос, который выполняет поиск по базе данных, но получаю 0, измененный в результирующем объекте.

 let submit_files = await stu_task.updateOne({$and: [{course_name : "Web Development with Node js"}, {c_task : {_id : req.body.task_id}}]}, {$set : {c_task : {t_s_file : {t_s_email : check_cookie.email, t_s_file_inner : files_names, t_s_file_Date : Date.now()}}}});
 

Есть ли какие-либо проблемы в запросе, который я создал?

Комментарии:

1. если ваша проблема не решена, оставьте комментарий, в противном случае примите мой ответ

Ответ №1:

У вас нет «c_task._id», определенного в схеме, но он есть в критериях поиска updateOne …

Комментарии:

1. автоматически сгенерированный c_task._id просто принимает идентификатор в разделе c_task, и я получаю идентификатор внутреннего объекта, используя req.body.task_id

Ответ №2:

Вам также нужны фильтры arrayFilters для обновления вложенных массивов, проверьте документацию, а также вам нужен идентификатор для поиска в t_s_file массиве в следующем запросе используется t_s_email поле, потому что я не знаю реальных данных, поэтому я ищу на t_s_file основе t_s_email can, используя _id if exist

 await stu_task.updateOne(
  {
    $and: [
      { course_name: "Web Development with Node js" },
      { "c_task._id": req.body.task_id },
    ],
  },
  {
    $set: {
      "c_task.$[].t_s_file.$[i].t_s_email": {
        t_s_email: check_cookie.email,
        t_s_file_inner: files_names,
        t_s_file_Date: Date.now(),
      },
    },
  },
  { arrayFilters: [{ "i.t_s_email": "email@gmail.com" }] }
);