Mongoose save() 方法不写入数据库

Posted

技术标签:

【中文标题】Mongoose save() 方法不写入数据库【英文标题】:Mongoose save() method not writing to database 【发布时间】:2014-02-17 00:35:12 【问题描述】:

所以我正在更新猫鼬中用户子文档的属性,但它没有保存到我的数据库中。

这是我的功能:

@User.findOne('email': email, (err, user) ->
    if err?
        callback(err)
    else if user?
        for account in user['accounts']
            if account['account_uuid'] is account_uuid

                account.state = "Verified"

                user.save((err, updated_user, numberTouched) ->
                    if err?
                        console.log err
                        return callback(err)
                    else
                        console.log 'Successfully verified account'
                        console.log updated_user

                        return callback(null, 'Successfully verified account')
                )
                return                        
        callback(new Error('No account for account_uuid'))
)

真正令人沮丧的是updated_user 返回时account.state 属性为“已验证”,而numberTouched 变量返回为1,这意味着1 个文档已受到保存的影响。但是当我检查数据库中的用户文档时,它仍然是“待定”的默认值。

有什么想法吗?

附:我正在使用 MongoLab 的开发数据库。但我不认为问题出在他们身上,因为我可以很好地更新其他属性。

【问题讨论】:

啊,实际上没有。添加一个修复它! 我无法处理 mongoose 静默失败... 我曾经使用 Mongoose 的 .markModified() 函数修复了一个类似的问题。它是否也解决了这种情况下的问题? 您可能想要添加一个答案,并说明您必须采取哪些措施来修复它,因为遇到类似问题的其他人可能会发现这个问题。 我最喜欢的另一个无声Mongoose故障:数据库未连接,无连接查询时没有错误。 【参考方案1】:

假设您要更改混合类型的子文档,您需要在保存前致电 user.markModified('accounts') 让 Mongoose 知道更改的内容。

但是,如果其中两个操作同时发生,您可能会丢失数据。我建议您将findAndModify 命令与$elemMatch$set 运算符结合使用。

【讨论】:

【参考方案2】:

在你输入的那一行

for account in user['accounts']

您正在创建一个独立于 User 模型实例的新变量。您可以使用该变量来显示数据(例如通过 REST API),但不能用于修改用户模型实例。又名。您正在修改另一个变量。

请尝试修改您从 findOne() 查询中获取的用户并保存。

【讨论】:

以上是关于Mongoose save() 方法不写入数据库的主要内容,如果未能解决你的问题,请参考以下文章

mongoose中Documents的save方法

Mongoose .save() 返回空错误对象,不保存在数据库中

Mongoose 异步 .save 和回调

我希望我的 pre('save') mongoose 函数只运行一次

文档不会使用带有 mongoose 的 save() 方法保存

我可以从 post save 中间件执行 mongoose 更新吗?