push не работает в массиве mongoose / mongodb - PullRequest
0 голосов
/ 27 апреля 2018

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

У меня есть модель мангуста:

var WorkSchema = new mongoose.Schema({
    title: String,
    genre: String,
    workType: String,
    length: Number,
    ageRange: String,
    author: {
        id: {
            type: mongoose.Schema.Types.ObjectId,
            ref: "User"
        },
        username: String
    },
    manuscriptText: String,
    workRating: [
        {
            reviewerName: String,
            critique: String,
            date: Date
        }
    ],
    ratingNumber: [Number],
    ratingSum: {
        type: Number,
        default: 0
    }
});

Вот мой пост с полным закомментированным кодом ошибки:

// post route for getting the review
router.post('/:id', function(req, res) {

    var critique = req.body.critique;
    var reviewerName = req.user.username;

    // find the right work associated with the critique
    Work.findById(req.params.id, function(err, foundWork) {
        if(err) {
            console.log(err);
        } else {

            // foundWork.workRating.reviewerName.push(reviewerName);
            // foundWork.workRating.critique.push(critique);
            // foundWork.workRating.date.push(Date());
            // foundWork.save();

            //     });
            // }
            // foundWork.update(
            //     {$push: {workRating: }
            //     }
            // );
            // {
            //     $push: {
            //         workRating: {
            //             reviewerName: reviewerName
            //             reviewerReview: critique
            //         }
            //         // ratingNumber: req.body.clickedValue,
            //         // $inc: {
            //         //     ratingSum req.body.clickedValue
            //         // }
            //     }
            // }
        }
    });
});

Какого черта я делаю неправильно, чтобы получить эти два значения в этот массив?

Ответы [ 2 ]

0 голосов
/ 27 апреля 2018

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

Просто используйте .updateOne() непосредственно на модели вместо findById():

Work.updateOne(
  { "_id": req.params.id },
  { 
    "$push": {
      "workRating": { 
        "reviewerName": reviewerName,
        "critique": critique,
        "date": new Date()
      },
      "ratingNumber": req.body.clickedValue
    },
    "$inc": {
      "ratingSum": req.body.clickedValue
    }
  },
  function(err, response) {
   // handling
  }
)

.updateOne() является «предпочтительным» в современном API, когда вы фактически хотите «обновить один» документ. Метод update() делает то же самое и обновляет только «первое совпадение», но его использование считается «устаревшим» по сравнению с использованием более «описательного» метода в вашем коде.

Или, если вы действительно хотите, чтобы документ был возвращен .findByIdAndUpdate():

Work.findByIdAndUpdate(req.params.id,
  { 
    "$push": {
      "workRating": {
        "reviewerName": reviewerName,
        "critique": critique,
        "date": new Date()
      },
      "ratingNumber": req.body.clickedValue
    },
    "$inc": {
      "ratingSum": req.body.clickedValue
    }
  },
  { "new": true },             // need to get the "modified" document
  function(err, foundWork) {
    // handling
  }
)

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

Или по "не очень хорошему" шаблону "fetch / modify / save":

foundWork.workRating.push({
  "reviewerName": reviewerName,
  "critique": critique,
  "date": new Date()
});
foundWork.ratingNumber.push(req.body.clickedValue);
foundWork.ratingSum = foundWork.ratinSum + 1;

foundWork.save(function(err,modifiedWork) {
  // handling
});

Где вы снова действительно пытаетесь .push() в неправильных местах.

Обратите внимание, что вы также можете добавить в свою схему:

"date": { "type": Date, "default": Date.now }

Который автоматически применит это значение ко всем операциям здесь, поскольку mongoose изменит операции обновления на основе настройки схемы.

0 голосов
/ 27 апреля 2018

В том, что вы делаете, есть много неправильного. push - это функция для добавления элемента в массив, и ни один из reviewerName, critique или date не является массивом. Вот почему вы видите .push is undefined.

Похоже, вы пытаетесь обновить документ с помощью push объекта в массиве workRating. Итак, вот как вы это делаете

Work.update({_id :req.params.id }, {$push : {workRating : {reviewerName : "A", 
critique : "XYZ", date : "your_date"}}})
...