猫鼬:将对象推入对象数组

时间:2018-11-05 00:19:31

标签: mongoose push subdocument

我正在研究其他各种类似的问题,但似乎无法理解为什么我不能将只有2个数字的对象推入数组。

我尝试从中复制的示例如下: Mongoose findOneAndUpdate: update an object in an array of objects How to push an array of objects into an array in mongoose with one call? Mongoose .find string parameters

以及官方文档:https://mongoosejs.com/docs/api.html#mongoosearray_MongooseArray-push

这是我的模式

Not in Constitution

我的推送代码如下:

const BatchSchema = new mongoose.Schema({

  title: {
    type: String,
    required: true,
    trim: true
  },

  envRecord: {
    type: [{
      tmp: {
        type: Number
      },
      hum: {
        type: Number
      }
    }],
  }

});

BatchSchema.plugin(timestamp);

const Batch = mongoose.model('Batch', BatchSchema);
module.exports = Batch;

使用邮递员,我正在使用PUT在正文中发送以下JSON

 server.put('/batches/:title', async(req, res, next) => {
    //Check for JSON
    if (!req.is('application/json')) {
      return next(new errors.InvalidContentError("Expects 'application/json'"));
    }

    try {
      const batch = await Batch.findOneAndUpdate(
        { _title: req.params.title },
        req.body,
        batch.envRecord.push({ tmp, hum })
      );
      res.send(200);
      next();
    } catch(err) {
      return next(new errors.ResourceNotFoundError(`There is no batch with the title of ${req.params.title}`));
    }
  });

我有点困惑的是,我发现的所有示例都在使用http://xxx.xx.xx.xxx:3000/batches/titleGoesHere { "tmp": 20, "hum": 75 } ,但是官方文档似乎不再使用它了,而是在使用$push这就是为什么我试图将我的引用称为MongooseArray.prototype.push()

是的,我已经检查标题是否匹配并且可以使用

找到该批次
batch.envRecord.push({ tmp, hum })

1 个答案:

答案 0 :(得分:0)

您正在传递batch.envRecord.push({ tmp, hum })作为findOneAndUpdate的第三个参数,它代表查询选项对象。因此,仅在执行findOneAndUpdate并对其save之后才需要推入对象。这种方法的缺点是执行两个查询:

const batch = await Batch.findOneAndUpdate(
  { title: req.params.title },
  req.body   
).exec();

batch.envRecord.push({ tmp, hum });
batch.save();

这就是为什么使用$push是首选方法的原因。