Вставить элемент в массив в мангусте

Я пытаюсь вставить элемент в массив в мангусте. Я делаю это с помощью update и $ push. Но он не обновляет его в базе данных. Это мой код. routes.js:

    var Chooser = require('../chooser');

    var appRouter = function(app) {

    app.put("/chooser/:id", function(req, res) {
    console.info("ID: ", req.params.id);
    if (!req.body.toFollow) {
        return res.send({"status": "error", "message": "The account that you want to follow is needed"});
    }
    else {
        console.info("Cuenta: ", req.body.toFollow);
        Chooser.update({_id: req.params.id}, {$push: {accounts: {"name": "foo", "idAccount": 123456}}});
        return res.send({"status": "ok"});
    }

  });
}

Это моя схема мангуста. Chooser.js:

var mongoose = require('mongoose');

var chooserSchema = mongoose.Schema({
_id: Number,
accounts: [{name: String, idAccount: Number}]
}, { _id: false });

var Chooser = mongoose.model('Chooser', chooserSchema);

module.exports = Chooser;

"Cuenta" входит в консоль? Кроме того, разве вы не хотите res.send после .update, то есть в функции обратного вызова обновления?

George 09.04.2018 23:24

См. stackoverflow.com/questions/14877967/…

JohnnyHK 09.04.2018 23:25

Отвечает ли это на ваш вопрос? Array.push, похоже, не работает на MongoDB

Kavale arun 30.01.2020 11:26
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
3
3
10 339
4

Ответы 4

Насколько я знаю, вы должны сделать как показано ниже.

Model.findAndUpdate({_id: 'your_id'}, 
                    {$push: {'your_array_field': 
                    {"name": "foo","idAccount": 123456}}}, 
                    {new: true}, (err, result) => {
                    // Rest of the action goes here
                   })

Мы делаем это таким образом - мы добавляем еще одну модель, но в вашем случае вы просто добавляете массив, поэтому поместите его в переменную вместо req.body.resource ..

Также вы можете просто использовать findByIdAndUpdate, а не Async, если не хотите.

вот модельный элемент:

 resources: [{type: mongoose.Schema.Types.ObjectId, ref: 'Resource'}],

вот метод добавления элемента в массив:

//AddResource to a crew
export function addResource(req, res) {
  if (req.body._id) {
    delete req.body._id;
  }
  Crew.findByIdAndUpdateAsync(req.params.id,
    {
      $push: { "resources": req.body.resource }
    },
    { safe: true, upsert: true },
    function (err, model) {
      if (err) {
        //console.info(err);
        return res.send(err);
      }
      return res.json(model);
    });

и удалить:

//deleteResource to a crew
export function deleteResource(req, res) {
  if (req.body._id) {
    delete req.body._id;
  }
  // console.info(req.body.resource);
  Crew.findByIdAndUpdateAsync(req.params.id,
    {
      $pullAll: { "resources": req.body.resource }
    },
    function (err, model) {
      // console.info(model);
      if (err) {
        //console.info(err);
        return res.send(err);
      }
      return res.json(model);
    });

Мы можем это сделать

Model.findOneAndUpdate({"_id":req.body.id},{
            "$push": {"resources": req.body.resources}
        },{new: true, safe: true, upsert: true }).then((result) => {
            return res.status(201).json({
                status: "Success",
                message: "Resources Are Created Successfully",
                data: result
            });
        }).catch((error) => {
            return res.status(500).json({
                status: "Failed",
                message: "Database Error",
                data: error
            });
        });`

Вот как вы можете обновить модель в мангусте (используя асинхронное ожидание):


let updatedModel = await Model.findByIdAndUpdate(req.params.id,

 { $push: { accounts:{"name": "foo", "idAccount": 123456} } },

 { 'upsert': true });

или в вашем коде

Возможно, вы пропустили {new: true, upsert: true}, если хотите, чтобы обновленный документ был возвращен вам.

Chooser.update({_id: req.params.id}, {$push: {accounts: {"name": "foo", "idAccount": 123456}}},{new: true, upsert: true });

Другие вопросы по теме