findOneAndUpdate Mongoose with Array

时间:2018-03-18 17:05:05

标签: node.js mongoose

我使用Node.JS作为后端,Angular4作为FrontEnd使用。

我想从某行的angular更改为findOneAndUpdate

的数组

这是我的模特

        subLot: [{
          room: String,
          beforePicture: String,
          afterPicture: String,
          Realisations: [{
                realisationName : String,
                specialtyName : String,
                pu: Number,
                unite: String,
                quantite: Number,
                startDate: Date, // Attribute to Update
                endDate: Date, // Attribute to Update

          }]
        }]

更改将在" startDate" "结束日期"其中:

  

(let body = req.body.subLot)subLot [x] .room == body [x] .room&&   subLot [x] .Realisations [y] .realisationName ==   体[X] .Realisations [Y] .realisationName

这是我在Node.JS中的功能

var lot = Devis.
    findOneAndUpdate({ "project": req.params.projectId }, { "$set": { "subLot": req.body.subLot } }).
    exec(function (err, lot) {
        if (err) {
            res.status(500).send(err);
            return;
        }
        res.status(200).json({ lot: lot, success: true });

        return;
    })

1 个答案:

答案 0 :(得分:0)

您正在做的是更新阵列字段。但你想要做的是更新一个数组字段项,subLot是一个数组,并且你想更新该数组中的一个值而不是整个数组。

我想你可以做的是根据项目ID获取devis,然后找到适当的批次进行更新。如下面的代码所示。

Devis.
findOne({ "project": req.params.projectId }).
  exec(function (err, devis) {
     if (err) {
         res.status(500).send(err);
         return;
     }
     var lottoUpdate = devis.subLot.find(function(l){ //using Array.find
          return l._id === lot._id;
     });
     lottoUpdate = lot; // update reference of found lot object to the lot object posted from angular.
     devis.save(function(err){
       if (err) {
         res.status(500).send(err);
         return;
      }
      res.status(200).json({ lot: lot, success: true }); 
     }); 
     return;
 })

另外我建议你使用promises而不是回调。