Mongoose Redis Nodejs - как правильно сохранить объект - PullRequest
0 голосов
/ 11 января 2019

У меня проблема с кэшированием объектов Mongoose с использованием Redis в моем файле node.js в API экспресс-фреймворка.

Я извлекаю сохраненный User объект из Redis, увлажняю объект Mongoose, делаю некоторые обновления в объекте User и, наконец, сохраняю:

    const cachedUser = await redisClient.get(userId)

    if (cachedUser) {
        console.log('SERVING FROM CACHE')
        const user = User.hydrate(JSON.parse(cachedUser))

        const formattedRoleIds = _.map(roleIds, (element) => {
            return new mongoose.Types.ObjectId(element)
        })

        // add roles to the user object and save
        user.roles = formattedRoleIds

        try {
            await user.save()
            resolve(user.roles)

        } catch (err) {
            err.statusCode = 500
            reject(err)
        }

        return
    }

Но здесь возникает проблема. Если свойство User object __v не совпадает с фактическим числом в документе MongoDB, я получаю ошибку, подобную этой:

"Не найден соответствующий документ для идентификатора \" 5c0931a8428bd4ba0b9b1fcc \ " версия 15 измененных путей \ "ролей \" "

Я хотел бы продолжить выбор User объекта из Redis для его обновления и сохранения в MongoDB для будущих User выборок.

Я новичок в этом. Если что-то ужасно не так, укажите это в своем ответе.

РЕДАКТИРОВАТЬ 1

В документации Mongoose говорится, что при использовании Model.hydrate() пути объектов не помечаются как измененные по умолчанию: https://mongoosejs.com/docs/api.html#model_Model.hydrate Поэтому мои изменения в массиве в объекте не будут сохранены.

Но при использовании new User(JSON.parse(cachedUser)) я получаю ошибку:

E11000 коллекция повторяющихся ошибок ключей: индекс db.users: id dup ключ: {: ObjectId ('5c0931a8428bd4ba0b9b1fcc')}

¯\_(ツ)_/¯

Как мне подойти к этой проблеме?

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