如何通过猫鼬更新子文档的值?

时间:2018-09-25 16:34:50

标签: node.js mongodb express mongoose

我正在尝试通过PUT请求更新嵌套文档的值。它适用于文档中的值,但不适用于子文档中的值。

const AnotherSchema = new Schema ({
    Name: String,
    Age: Number,
    Appearance: {
       Hair: String, Eyes: String, Height: Number}; 

我的路线是这样

 router.put("/looks/:id/edit", function(req, res) {
    var Name= "blob"; 
    var Hair= "blue";
    AnotherSchema.findByIdAndUpdate(req.params.id, {Name, Hair}, function(err, feedback){
        if (err){
        res.send("error");
        } else {
        res.redirect("/looks");
        }
        });
    });

此路线可用于更新名称,但不能用于更新头发。我已经尝试过Appearance.Hair,但是这在控制台中引发了错误,因为意外的.我也已经尝试过[](){},但是这些都不是做到这一点," "也没有,这个问题似乎没有出现在文档中。

2 个答案:

答案 0 :(得分:0)

您应该使用$set运算符,否则您将整个记录替换为作为参数提供的对象。

var updateObj = {
  { $set: { Name: "blob", Appearance: { Hair: "blue" } } }
};

AnotherSchema.findByIdAndUpdate(req.params.id, updateObj, function (err, feedback) { ... });

答案 1 :(得分:0)

您应该通过对象符号提供要更新的道具的路径:

router.put("/looks/:id/edit", function(req, res) {
  AnotherSchema.findByIdAndUpdate(req.params.id, {
    Name: "blob",
    Appearance: {
      Hair: "blue"
    }
  }, function(err, feedback) {
    if (err) {
      res.send("error");
    } else {
      res.redirect("/looks");
    }
  });
});

以上findByIdAndUpdate等同于:

{ $set: { Name: "blob", Appearance: { Hair: "blue" } } } https://codesandbox.io/s/mz2z13w88p