我在Express Framework API的node.js中使用Redis缓存Mongoose对象时遇到问题。
我要从Redis中提取存储的User
对象,为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
对象__v
属性与MongoDB文档中的实际数字不匹配,我将收到如下错误:
“未找到ID为\ 5c0931a8428bd4ba0b9b1fcc \的匹配文档” 版本15 ModifyedPaths \“角色\”“
我想继续从Redis获取User
对象以进行更新,并保存在MongoDB中以备将来进行User
获取。
我是一个初学者。如果出现严重错误,请在您的答案中指出。
编辑1
猫鼬文档说,使用Model.hydrate()
时,对象路径默认未标记为已更改:https://mongoosejs.com/docs/api.html#model_Model.hydrate
因此,我在对象数组中所做的更改将不会保存。
但是使用new User(JSON.parse(cachedUser))
时出现错误:
E11000重复密钥错误集合:db.users索引: id dup密钥:{:ObjectId('5c0931a8428bd4ba0b9b1fcc')}
¯\_(ツ)_/¯
我应该如何解决这个问题?