Возникли проблемы с поиском / или реализацией правильного метода mongoDb для поиска и обновления вложенного документа

1

Я пытаюсь обновить определенное поле в под-документе на основе его Id и Id родительского документа. Я новичок в этом, поэтому я могу неправильно понять документацию mongoDb, но насколько я могу судить, findOneAndUpdate должен работать. Я также пытался просто обновить, updateOne, а также findByIdAndUpdate. Ничто из того, что я пробовал, не обновило мой объект.

Я пытаюсь обновить значение рейтинга в конкретном объекте в массиве saveBeers.

Вот моя модель:

{
    "_id": {
        "$oid": "5c97cf50cc81525a75eb6c19"
    },
    "email": "[email protected]",
    "password": "$2b$10$6ixbu2Ka.Zj0eE5kF21MLO6CiMblgu4D6IHiC7Ta52o.cZFMNw1Mm",
    "__v": 0,
    "savedBeers": [
        {
            "id": 2,
            "comment": null,
            "rating": 0
        },
        {
            "id": 4,
            "comment": null,
            "rating": 0
        },
        {
            "id": 8,
            "comment": null,
            "rating": 0
        }
    ]
}

Внешний интерфейс:

function addRating(beerId, ratingValue){
    let userId= localStorage.userId
    console.log(beerId, userId, ratingValue);
    $.ajax({
        type: "PUT",
        url: '/user/${userId}/${beerId}/${ratingValue}',
        success: addRatingSuccess,
        error: addRatingError
    });
    function addRatingSuccess(response) {
        console.log("added", response);
    }
    function addRatingError() {
        console.log("error");    
    }
}

Backend userController.js:

addRating:(req,res)=>{
            console.log(req.params);
            try{
            db.User.findByIdAndUpdate(
                {_id: req.params.userId, "savedBeers.id": req.params.beerId },
                { $set: { 'savedBeers.$' <<tried savedBeers.$.rating here as well>> : req.params.ratingValue } },
            function(err, data) {
                if(err){
                    console.log(err);
                } else {
                    console.log("data",data);
                    res.json({
                        data
                    })
                }
            } 
        )}
        catch(e){
            print(e)
        }

Я тоже это пробовал, но всегда получаю один и тот же результат:

addRating:(req,res)=>{
            console.log(req.params);
            try{
            db.User.findOneAndUpdate(
                {_id: req.params.userId},
                { $set: { 'savedBeers.$.rating' : req.params.ratingValue } },
                {arrayFilter: {'savedBeers.id' :{$eq:req.params.beerId}}},
            function(err, data) {
                if(err){
                    console.log(err);
                } else {
                    console.log("data",data);
                    res.json({
                        data
                    })
                }
            } 
        )}
        catch(e){
            print(e)
        }

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

Это ответ, который я получаю в передней части:

added 
 {data: {…}}
  data:
   email: "[email protected]"
   savedBeers: Array(3)
    0: {id: 2, comment: null, rating: 0}
    1: {id: 4, comment: null, rating: 0}
    2: {id: 8, comment: null, rating: 0}
  length: 3
 __proto__: Array(0)
 __v: 0
 _id: "5c97cf50cc81525a75eb6c19"
 __proto__: Object
 __proto__: Object

И бэкэнд:

{ userId: '5c97cf50cc81525a75eb6c19',
  beerId: '8',
  ratingValue: '4' }
data { savedBeers:
   [ { id: 2, comment: null, rating: 0 },
     { id: 4, comment: null, rating: 0 },
     { id: 8, comment: null, rating: 0 } ],
  _id: 5c97cf50cc81525a75eb6c19,
  email: '[email protected]',
  __v: 0 }

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

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

  • 0
    Я тоже попробовал это решение. Тоже не работает Отредактировал мой пост, чтобы отразить это.
  • 0
    Работает для остальных людей в мире и делает это уже много лет. Также обратите внимание, что вы не можете использовать предикат из нескольких полей с findByIdAndUpdate() так как он принимает только значение _id . findOneAndUpdate() этого вы хотите использовать findOneAndUpdate() а также, как правило, хотите new: true с любым из них. Не откроется, так как связанный ответ действительно является ответом, просто вы все еще делаете неправильно. Прочитайте ответы и связанную документацию еще раз.
Показать ещё 4 комментария
Теги:
express
subdocument

1 ответ

1

Похоже, что вы пропускаете ".rating" после "saveBeers. $" В "{$ set: {'SavedBeers. $': Req.params.ratingValue}"

Таким образом, эта строка должна быть "{$ set: {'saveBeers. $. Rating': req.params.ratingValue}"

  • 0
    Спасибо за ответ. Я тоже это попробовал. Тот же результат.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню