【问题标题】:Mongoose save() method not writing to databaseMongoose save() 方法不写入数据库
【发布时间】: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故障:数据库未连接,无连接查询时没有错误。

标签: node.js mongodb coffeescript mongoose


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    在你输入的那一行

    for account in user['accounts']
    

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

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

    【讨论】:

      猜你喜欢
      • 2021-09-19
      • 2016-02-05
      • 1970-01-01
      • 2017-01-16
      • 2014-10-27
      • 1970-01-01
      • 2019-09-03
      • 2017-01-31
      • 2020-12-31
      相关资源
      最近更新 更多