Как записать данные sh в массив mongodb? - PullRequest
1 голос
/ 07 марта 2020

Это моя схема:

const productSchema = new mongoose.Schema({
  name: String,
  imageUrl: String,
  category: String,
  price: Number,
  description: String,
  featured: {
    default: false
  },
  rating: [
    {
      userName: String,
      score: Number,
      comment: String
    }
  ]
});

И вот как я пытался поместить данные sh в свою базу данных.

app.route("/review").post(function(req, res) {
  const score = req.body.score;
  const comment = req.body.comment;

  if (req.isAuthenticated()) {
    const review = {
      $push: {
        rating: {
          userName: req.user.fName,
          score: score,
          comment: comment
        }
      }
    };
    console.log(review, req.body.productName);
    Product.updateOne({ name: req.body.productName }, review, function(
      err,
      done
    ) {
      if (err) {
        console.log(err);
      } else {
        res.redirect("/products");
      }
    });
  } else {
    res.redirect("/login");
  }
});

В официальной документации говорится что это путь к pu sh данным в массиве MongoDB. Но все еще не повезло. Помогите мне pu sh отзывов в поле массива рейтинга. Спасибо.

1 Ответ

1 голос
/ 08 марта 2020

для моего ответа я использую функцию mon goose findOneAndUpdate, вместо этого вы можете использовать updateOne. Запись в базу данных будет выполняться в асин c функции, чтобы не блокировать процесс узла (будет намного быстрее) , Размещение всего кода в блоке try-catch позволит вам контролировать любые ошибки, если они возникнут. Вы можете узнать больше о функции драйвера mon goose и найтиOneAndUpdate здесь: https://docs.mongodb.com/manual/reference/method/db.collection.findOneAndUpdate/ Подробнее об функции asyn c: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/async_function

app.route('/review').post(async function(req, res) {
//destructuring values from body-parser
  const { score, comment, productName } = req.body;

  if (req.isAuthenticated()) {
    //creating the rating obj
    const rating = {
      userName: req.user.fName,
      score: score,
      comment: comment
    };
    console.log(review, productName);
   //setting it all in a try-catch block
    try {
      const product = await Product.findOneAndUpdate(
        {name: productName},
        { $set: { rating: rating } },
        { new: true }
      ).then(err => {
        if (err) throw err;
        return res.redirect('/products');
      });
      res.redirect('/login');
    } catch (error) {
      console.log(error);
    }
  }
});

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

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