更新mongodb中的值

时间:2013-08-14 07:53:29

标签: node.js mongodb

我有一个名为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"
      }
    ],

1 个答案:

答案 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属性