Хобрук: Ваш путь к мастерству в программировании

Как обновить все вложенные документы массива в выбранном документе в мангусте?

В ситуации мне нужно обновить поле всех документов, вложенных в массив в модели Mongoose.

Я добавляю новый вложенный документ загруженного изображения в коллекцию пользователей, и мне нужно установить «is_available» всех предыдущих документов как ложное и только поле «is_available» вновь вставленного документа должно быть истинным.

Все, что я искал и нашел, касалось обновления вложенного документа с определенным идентификатором или фильтром. но я не нашел способа обновить конкретное поле всех вложенных документов массива в модели.

Моя модель:

var mongoose = require("mongoose");
var Schema = mongoose.Schema;

var UsersSchema = new Schema({
  name: { type: String, default: "" },
  lastname: { type: String, default: "" },
  images: [{
    dir: { type: String },
    is_available: { type: Boolean }
  }]
});

var Users = mongoose.model("Users", UsersSchema, "users");
module.exports = Users;

Фактический результат:


{ 
    "_id" : ObjectId("5ce950aa4sw435ty503ab83b"), 
    "name" : "Sina", 
    "image" : [
        {
            "_id" : ObjectId("5cf4dd3da6b4gb6bcf9c6dc1"), 
            "dir" : "profiledirectory/804eafeaf8acc40a3d6.jpg", 
            "is_available" : true
        }, 
        {
            "_id" : ObjectId("5cf4fffs2419316bddffgg82"), 
            "dir" : "profiledirectory/d85b01ac40fa6b1a7c1.jpg", 
            "is_available" : true
        }, 
        {
            "_id" : ObjectId("5cf4ff334fhd316bef2fdt40"), 
            "dir" : "profiledirectory/512d9d19da7a4322b37.jpg", 
            "is_available" : true
        }
    ]
}

Ожидаемый результат:


{ 
    "_id" : ObjectId("5ce950aa4sw435ty503ab83b"), 
    "name" : "Sina", 
    "image" : [
        {
            "_id" : ObjectId("5cf4dd3da6b4gb6bcf9c6dc1"), 
            "dir" : "profiledirectory/804eafeaf8acc40a3d6.jpg", 
            "is_available" : false
        }, 
        {
            "_id" : ObjectId("5cf4fffs2419316bddffgg82"), 
            "dir" : "profiledirectory/d85b01ac40fa6b1a7c1.jpg", 
            "is_available" : false
        }, 
        {
            "_id" : ObjectId("5cf4ff334fhd316bef2fdt40"), 
            "dir" : "profiledirectory/512d9d19da7a4322b37.jpg", 
            "is_available" : true
        }
    ]
}
Code Snippet:

let updateQuery = {
  $set: { 'image.$.is_available': false },
  $push: {
    image: [
      {
        dir: "profiledirectory/558bb6938ecd54bde556af122a4.jpg",
        is_available: true
      }
    ]
  }
}


let findQuery = { _id: req.body.user_id }

Users.findOneAndUpdate(findQuery,
  updateQuery, function (err, doc) {
    if (err) {
      res.send(err.message)
    } else {
      res.send('successful')
    }
  })

  • какой запрос вы пробовали? 03.06.2019
  • я обновил свой вопрос и добавил фрагмент кода 03.06.2019
  • мой ответ работает? 04.06.2019
  • @SaurabhMistry Я объединил ваш ответ с ответом @mourya venkat. user.save((err,updated)… у меня не сработало, я использовал eventObject.findOneAndUpdate(... для этой части. спасибо 04.06.2019

Ответы:


1

Согласно тому, что вы упомянули, вы продолжаете динамически добавлять объекты в поле изображения, и каждый раз, когда вы добавляете новый объект, существующие объекты должны быть переопределены с помощью is_available:false.

    eventObject.find(query).lean().exec(function (err, response) {
        if (err) {
            logger.error(err);
            return reject(err.message)
        }
        // Assuming there will be only one record based on the query you make
        if(response.length>0){
            response[0].images = response.images.map((image)=>{
                image.is_available = false
                return image
            })

            // Now append your new image to the modified response
            response[0].images.push(newimage)// this should be the newImage object
            // Now use findOneAndUpdate to update the existing doc by querying with id or according to your usecase

            eventObject.findOneAndUpdate(query, response[0], { upsert: true }, (err, data) => {
            if (err) {
                return reject(err)
            }
            logger.info(data);
            return resolve(newData);
        })
        }
    })

Таким образом, основной подход заключается в том,

  1. Получить документ из БД
  2. Обновить содержимое документа
  3. Добавьте новые данные
  4. обновить запись обновленными данными.
03.06.2019

2

после того, как вы загрузили файл, вы должны найти пользователя

  // after upload image 

  User.findOne({_id:req.user._id}).lean().exec((err,user)=>{
        if(!err && user){
              // setting all previous images to false 
              user.image.forEach(image=>{
                    image.is_available=false;
              });
              // now pushing new uploded item to image array
        let newImage={"dir" : "path of uploaded item here"  , "is_available" : true};

              user.image.push(newImage);
              user.save((err,updated)=>{
                   if(!err && updated){ 
                     return res.status(200).json({status:"success",message:"User updated"});
                   }
              });
        }
  });
03.06.2019
Новые материалы

Создание кнопочного меню с использованием HTML, CSS и JavaScript
Вы будете создавать кнопочное меню, которое имеет состояние наведения, а также позволяет вам выбирать кнопку при нажатии на нее. Финальный проект можно увидеть в этом Codepen . Шаг 1..

Внедрите OAuth в свои веб-приложения для повышения безопасности
OAuth — это широко распространенный стандарт авторизации, который позволяет приложениям получать доступ к ресурсам от имени пользователя, не раскрывая его пароль. Это позволяет пользователям..

Классы в JavaScript
class является образцом java Script Object. Конструкция «class» позволяет определять классы на основе прототипов с чистым, красивым синтаксисом. // define class Human class Human {..

Как свинг-трейдеры могут использовать ИИ для больших выигрышей
По мере того как все больше и больше профессиональных трейдеров и активных розничных трейдеров узнают о возможностях, которые предоставляет искусственный интеллект и машинное обучение для улучшения..

Как построить любой стол
Я разработчик программного обеспечения. Я люблю делать вещи и всегда любил. Для меня программирование всегда было способом создавать вещи, используя только компьютер и мое воображение...

Обзор: Машинное обучение: классификация
Только что закончил третий курс курса 4 часть специализации по машинному обучению . Как и второй курс, он был посвящен низкоуровневой работе алгоритмов машинного обучения. Что касается..

Разработка расширений Qlik Sense с qExt
Использование современных инструментов веб-разработки для разработки крутых расширений Вы когда-нибудь хотели кнопку для установки переменной в приложении Qlik Sense? Когда-нибудь просили..