Пн goose: Как разместить в массиве внутри схемы - PullRequest
0 голосов
/ 16 апреля 2020

У меня есть схема компании, которая будет содержать некоторые данные для этой компании и массив сообщений. Когда пользователь отправляет сообщение, я использую паспорт для декодирования токена и получения некоторой информации о пользователе. Внутри этой пользовательской информации есть идентификатор объекта, который позволяет мне найти компанию, к которой принадлежит пользователь.

Итак, теперь я нашел компанию, к которой принадлежит пользователь, и мне нужно сохранить отправленное сообщение в массив board_posts внутри этой компании

const mongoose = require('mongoose');
const Schema = mongoose.Schema;

const BoardPostSchema = new Schema({
    name: {
        type: String
    }
});

const CompanySchema = new Schema({
    company_name: {
        type: String
    },
    board_posts: [BoardPostSchema],
});

module.exports = Company = mongoose.model('companies', CompanySchema);
router.post('/new-opportunity',  passport.authenticate('jwt', { 
    session: false 
}), (req, res) => {
    let user = req.user;
    let newPost = req.body;
    let companyId = user.company_id;

    const boardPost = {
        name: newPost.name
    };

    Company.find({'_id': companyId})
        .then(company => {
            // push boardPost into this company.board_posts array
        })
        .catch(error => {

        });
});

Ответы [ 3 ]

1 голос
/ 16 апреля 2020

Альтернативное решение с findByIdAndUpdate:

router.post("/new-opportunity", passport.authenticate("jwt", { session: false }), (req, res) => {
  let user = req.user;
  let newPost = req.body;
  let companyId = user.company_id;

  const boardPost = {
    name: newPost.name,
  };

  Company.findByIdAndUpdate(
    companyId,
    {
      $push: {
        board_posts: boardPost,
      },
    },
    {
      new: true,
    }
  )
    .then((company) => {
      console.log("Updated compay if found:", company);
      res.send(company);
    })
    .catch((error) => {
      console.log(error);
      res.status(500);
    });
});

Или, если вы хотите только обновить статус, вы можете использовать updateOne :

router.post("/new-opportunity", passport.authenticate("jwt", { session: false }), (req, res) => {
  let user = req.user;
  let newPost = req.body;
  let companyId = user.company_id;

  const boardPost = {
    name: newPost.name,
  };

  Company.updateOne(
    { _id: companyId },
    {
      $push: {
        board_posts: boardPost,
      },
    }
  )
    .then((result) => {
      console.log(result);
      // result.n; // Number of documents matched
      // result.nModified; // Number of documents modified
      res.send(result);
    })
    .catch((error) => {
      console.log(error);
      res.status(500);
    });
});
1 голос
/ 16 апреля 2020

Вы можете использовать $push и update

router.post('/new-opportunity',  passport.authenticate('jwt', { 
    session: false 
}), (req, res) => {
    let user = req.user;
    let newPost = req.body;
    let companyId = user.company_id;

    const boardPost = {
        name: newPost.name
    };

    Company.update({_id: user.company_id},{
         $push{
             //the things you want to add
         }
    });
});

Надеюсь, это то, что вы хотите сделать!

0 голосов
/ 16 апреля 2020

Да, вы можете использовать операторы $push и findOneAndUpdate. Было бы лучше, если бы вы использовали подход async/await.

router.post('/new-opportunity',  passport.authenticate('jwt', { 
   session: false 
}), async (req, res) => {
   let user = req.user;
   let newPost = req.body;
   let companyId = user.company_id;

   const boardPost = {
       name: newPost.name
   };

  let response = await Company.findOneAndUpdate({'_id': companyId}, {
     $push: {
        board_posts: "testword1"
     }
  },{ new: true })  //i set this to true so mongodb will return me the new updated document

  res.send(response);

});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...