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 .save() 返回空错误对象,不保存在数据库中
我希望我的 pre('save') mongoose 函数只运行一次