Метод обновления возвращает странные данные, а не обновленные данные - PullRequest
0 голосов
/ 02 ноября 2018

У меня проблема с методом обновления, который возвращает этот объект при запуске моей конечной точки

{n: 1, nModified: 1, ok: 1}

Это код, который я пробовал, и я пытался использовать {new: true} , но это не помогает, я хочу получить обновленные данные обратно.

router.put('/:username/experience/edit/:id', function(req, res) {
    const { title, company, location, from, to, workingNow, description } = req.body;

    User
    .update({'experience._id': req.params.id},
        {'$set': {
            'experience.$.title': title,
            'experience.$.company': company,
            'experience.$.location': location,
            'experience.$.from': from,
            'experience.$.to': to,
            'experience.$.workingNow': workingNow,
            'experience.$.description': description,
        }},
        function(err, model) {
            console.log(model);
            if(err){
                return res.send(err);
            }
            return res.json(model);
        });
})

1 Ответ

0 голосов
/ 03 ноября 2018

Если вы используете MongoDB 3.0 или новее, вам нужно использовать .findOneAndUpdate() и использовать параметр projection, чтобы указать подмножество полей для возврата. Вам также нужно установить returnNewDocument на true. Конечно, вам необходимо использовать оператор проекции $elemMatch, потому что вы не можете использовать позиционную проекцию и вернуть новый документ.

Как кто-то указал:

Вы должны использовать .findOneAndUpdate(), потому что .findAndModify() выделяется как устаревший в каждом официальном языковом драйвере. Другое дело, что синтаксис и параметры довольно одинаковы для всех драйверов для .findOneAndUpdate(). С .findAndModify() большинство драйверов не используют один и тот же объект с ключами «query / update / fields». Так что это немного менее запутанно, когда кто-то обращается к другому языку, чтобы быть последовательным. Стандартизированные изменения API для .findOneAndUpdate() фактически соответствуют версии сервера 3.x, а не 3.2.x. Полное различие заключается в том, что методы оболочки на самом деле отстали от других драйверов (на этот раз!) В реализации метода. Таким образом, большинство драйверов на самом деле имели значительный удар по релизу, соответствующий релизу 3.x с такими изменениями.

db.collection.findOneAndUpdate( 
    { 
        "_id": ObjectId("56d6a7292c06e85687f44541"), 
         "rankings._id" : ObjectId("46d6a7292c06e85687f55543") 
    },  
    { $inc : { "rankings.$.score" : 1 } },  
    { 
        "projection": { 
            "rankings": { 
                "$elemMatch": { "_id" : ObjectId("46d6a7292c06e85687f55543") } 
            }
        }, 
        "returnNewDocument": true 
    }
)

Начиная с MongoDB 3.0 и выше, вам нужно использовать findAndModify и опции fields, также вам нужно установить new в true, чтобы вернуть новое значение.

db.collection.findAndModify({   
    query: { 
        "_id": ObjectId("56d6a7292c06e85687f44541"), 
        "rankings._id" : ObjectId("46d6a7292c06e85687f55543") 
    },     
    update: { $inc : { "rankings.$.score" : 1 } },       
    new: true,  
    fields: { 
        "rankings": { 
            "$elemMatch": { "_id" : ObjectId("46d6a7292c06e85687f55543") }
        }  
    }
})

Оба запроса дают:

{
        "_id" : ObjectId("56d6a7292c06e85687f44541"),
        "rankings" : [
                {
                        "_id" : ObjectId("46d6a7292c06e85687f55543"),
                        "name" : "Ranking 2",
                        "score" : 11
                }
        ]
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...