我有一个名为User的mongodb模型,它有一个名为“inventory”的混合模式类型变量(包含用户包含的所有项目)。我想遍历所有用户,并更改其库存中每个项目的名称。特别是,我想将“10_alex_magician”或“3_maia_princess”格式的字符串分别转换为“alex_magician”和“maia_princess”。字符串转换相对简单,我使用x.split('')。slice(1).join('')来完成转换。
我遇到问题的地方就是当console.log显示已经应用了转换时,它似乎没有正确更新到mongodb,但是没有抛出任何错误消息。有谁知道如何解决这个问题?
Node.js功能
//function to change old naming of items "10_alex_magician" to "alex_magician"
function modifyUser() {
User.find({}, function(err, results) {
_.map(results, function(result) {
var regex = /^\d+_[A-Za-z]+_[A-Za-z]+$/
for (var i = 0, len = result.inventory.length; i < len; i++) {
if(regex.test(result.inventory[i].itemName)) {
result.inventory[i].itemName = result.inventory[i].itemName.split('_').slice(1).join('_');
result.save(function(err, r) {
if(err) console.log(err);
//logging r shows that the text has been correctly updated
console.log(r)
});
}
}
})
})
}
广告资源变量的格式
"inventory": [
{
"type": "sticker",
"numberOwned": 2,
"itemName": "1_alex_magician"
},
{
"type": "sticker",
"numberOwned": 1,
"itemName": "10_alex_scuba"
}
],
答案 0 :(得分:1)
Mongoose只对顶级属性进行自动更改检测,并且您正在修改嵌套属性,因此mongoose不会知道任何更改。使用markModified
告诉猫鼬你正在捣乱inventory
。
result.inventory[i].itemName = result.inventory[i].itemName.split('_').slice(1).join('_');
result.markModified('inventory');
result.save(....)
为了提高效率,您可能需要同时考虑.lean()
和.stream()
此类查询,只需使用findByIdAndUpdate
进行更新,只传递更新的inventory
属性