猫鼬Redis Node.js-如何正确保存对象

时间:2019-01-11 18:27:17

标签: node.js mongodb mongoose redis

我在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')}

¯\_(ツ)_/¯

我应该如何解决这个问题?

0 个答案:

没有答案