将findByIdAndUpdate用于嵌套猫鼬模式对象的正确方法是什么

时间:2018-08-24 06:00:29

标签: javascript node.js mongoose mongoose-schema

因此,我对Node.js和javascript真的很陌生,并且对NOSQL数据库没有太多经验。因此,我不太确定执行以下任务的正确方法是什么。

使用Schema.findByIdAndUpdate,如何在不向数据库中添加不必要的数据的情况下正确更新嵌套的模式对象。

这是我们的示例架构,

let OuterSchema = new mongoose.Schema({
  name: String,
  stuff: {
    type: [
      {
        type: mongoose.Schema.Types.ObjectId,
        ref: "InnerSchema"
      }
    ],
    required: true,
    default: void 0,
    validate: v => v.length > 0
  }
});

let InnerSchema = new mongoose.Schema({
  name: {
    type: String,
    required: true
  }
});

这是我想到的 PUT 请求

/** 
   * e.g. expected JSON body format
   * {
        "name": "Updated name outer schema", // can remove field if no update required
        "stuffs": [
            {
                "_id": "5b710854f2dafbf9fbe3c088",
                "name": "Updated name inner schema", 
            } // can remove field if no update required
        ]
    }
  */
function updateOuterSchema(req, res) {
  for (var i = 0; i < req.body.stuffs.length; i++) {
    InnerSchema.findByIdAndUpdate(
      req.body.stuffs[i]._id,
      { $set: req.body.stuffs[i] },
      { runValidators: true },
      (err, innerSchema) => {
        // abort if there is an error
        if (err) return;
      }
    );
  }
  let options = {
    new: true,
    runValidators: true
  };
  OuterSchema.findByIdAndUpdate(req.params.id, { $set: req.body }, options, (err, outerSchema) => {
    if (err) {
      res.status(400).send(err);
    } else {
      res.send(outerSchema);
    }
  });
}

但是,我希望有一个更好的方法,因为这样做有很多潜在的问题。

场景1

  • 主体中有多个InnerSchema对象用于更新
  • 所有InnerSchema对象已更新,最后一个除外
  • 请注意,我们现在进行的练习已更新一半。
  • 预期如果有1个无效的InnerSchema对象,所有更新将失败

场景2

  • 主体中用于更新的多个InnerSchema对象通过了更新
  • OuterSchema对象验证失败
  • 观察到我们现在已经更新了练习。
  • 预期所有更新都将在outerSchema无效的情况下失败。

0 个答案:

没有答案