【问题标题】:Mongoose - array value is not over overwritten on saveMongoose - 保存时不会覆盖数组值
【发布时间】:2018-01-03 04:36:25
【问题描述】:

对此有点绝望。该代码通过哈希查找用户。在返回的模型上,我更改了一些值并保存它。数据库中的所有属性都发生了变化,但是 parent.tree_data.total_children.level 的数组项 [0] 保持不变,尽管当我执行脚本时它在模型中发生了变化,但是在数据库中它没有改变。有什么想法吗?

      var parent = await utils.findUser(hash);   //returns mongoose model

      ... code in between where I use values from the parent doc ...

      //updating the parent doc via the model
      parent.tree_data.parent_tag = "dev";
      parent.tree_data.total_children.level[0]++;
      parent.tree_data.direct_children.push({share_hash: result.share_hash, nicname: result.nicname});
      parent.val = parent.val + 0.4;

      parent.save(function(err){
        if (err){
          console.log(err);
        }
      });

tree_data 的架构部分如下所示:

tree_data: {
    parent_tag: {type: String},
    parent_share_hash: {type: String, required: false, trim: true},
    direct_children: [{share_hash: {type: String, required: true, trim: true}, nicname: {type: "string", trim: true} }],
    total_children: {level: [Number]},
},

【问题讨论】:

  • 您是否在模型中定义了关卡子对象?
  • 编辑添加架构
  • 在db级别被列为类型“Array”
  • 有趣的是:当我添加:parent.tree_data.total_children.level.push(212341234);该元素将显示在数据库中。
  • 检查元素时:就在 .save 之前,parent.tree_data.total_children.level 看起来像这样:0:1 1:212341234 2:212341234 在数据库中看起来像这样:0:0 1:212341234 2:212341234 这太疯狂了

标签: javascript node.js mongoose


【解决方案1】:

您需要在元素上调用markModified,因为数组(或对象、混合类型等)在内容更改时不会自动标记。

看看Unable to update mongoose model

  parent.tree_data.parent_tag = "dev";
  parent.tree_data.total_children.level[0]++;
  parent.tree_data.direct_children.push({share_hash: result.share_hash, nicname: result.nicname});
  parent.val = parent.val + 0.4;


  parent.markModified('tree_data.direct_children'); // if that doesnt work, try: paremt.markModified('tree_data')


  parent.save(function(err){
    if (err){
      console.log(err);
    }
  });

【讨论】:

  • 谢谢! parent.markModified('tree_data.direct_children');没用,但“tree_data”有效。 'tree_data.direct_children.level' 甚至 'tree_data.direct_children.level[0]' 也没有用。
  • 我认为这是一个问题,认为即使用另一个覆盖模型 obj 的整个级别数组也不会使其在数据库中发生变化
猜你喜欢
  • 2017-04-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多