0

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

1 回答 1

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属性。

于 2013-08-14T08:34:23.037 回答