Как я могу получить доступ к upsertedId при использовании updateOne в MongoDB - PullRequest
1 голос
/ 04 августа 2020

У меня есть новые данные, которые я хочу вставить в свой array из blog (Моя коллекция выглядит так - показано ниже): -

{
    _id: 0,
    // other vars here...,
    blog: [
        {
            _id: 0,
            title: 'Article 1'
        },
        // add new article here
    ]
}

Прямо сейчас я могу добавить new article в моем blog array с кодом, показанным ниже: -

const query = {}
const update = { $push: { blog: inputData } }
const options = { upsert: true }

All.updateOne(query, update, options)
.then(result => {
    res.redirect(`/article/${result.upsertedId}`) // read MongoDB documentation that I can get the newly inserted data ID by using result.upsertedId
})
.catch(err => res.redirect(`/`)

Но я не могу получить ID недавно вставленных данных в свою коллекцию. Использование result.upsertedId возвращает мне undefined. Согласно приведенному выше коду, мне нужен ID, чтобы перенаправить пользователя на новую страницу этой статьи ID.

Вот документация, говорящая, что он будет return upsertedId updateOne

это result, которое я получаю, когда console.log это (в нем нет upsertedId)

введите описание изображения здесь

Ответы [ 3 ]

0 голосов
/ 04 августа 2020

Вам необходимо передать new: true в опции для получения идентификатора обновленного документа, т.е.

const query = {}
const update = { $push: { blog: inputData } }
const options = { upsert: true, new: true  }

All.updateOne(query, update, options)
.then(result => {
    //result is your upserted document
    console.log("Upserted document : ", result);// try getting your upserted _id 
        //from this result 
    res.redirect(`/article/${result.upsertedId}`) // change //result.upsertedId into result._id or result.id whatever you get into //your result
})
.catch(err => res.redirect(`/`)
0 голосов
/ 04 августа 2020

Это не применимо для вложенных документов.

То, что вы делаете, - это операция обновления.

Do c говорит

Значение _id для документ, вставленный операцией upsert. Это значение присутствует только в том случае, если включена опция upsert и запрос на обновление не соответствует ни одному документу.

И ваш запрос приводит к операции обновления. Вот почему вы получаете nModified.

Один из вариантов - вы можете использовать findOneAndUpdate с опцией returnNewDocument option true.

0 голосов
/ 04 августа 2020

Распечатайте результат, чтобы подтвердить получение идентификатора, ваш результат, скорее всего, будет примерно таким:

{ "acknowledged" : true, "matchedCount" : 1, "modifiedCount" : 1 }

Вы можете попробовать использовать collection.findOneAndUpdate и получить upsertedId из этого результат

...