У меня проблема с кэшированием объектов 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')}
¯\_(ツ)_/¯
Как мне подойти к этой проблеме?