#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" }] }
);