Mongoose: добавление объекта в массив объектов - PullRequest
0 голосов
/ 05 ноября 2018

Я просматривал различные другие подобные вопросы и просто не могу понять, почему я не могу поместить объект из двух чисел в массив.

Примеры, с которых я пытался копировать: Mongoose findOneAndUpdate: обновить объект в массиве объектов Как поместить массив объектов в массив в mongoose одним вызовом? Параметры строки Mongoose .find

И официальные документы: https://mongoosejs.com/docs/api.html#mongoosearray_MongooseArray-push

Это моя схема

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;

Мой push-код выглядит так:

 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}`));
    }
  });

Используя post man, я использую PUT для отправки следующего JSON в теле

http://xxx.xx.xx.xxx:3000/batches/titleGoesHere
{
    "tmp": 20,
    "hum": 75
}

Что меня смущает, так это то, что все примеры, которые я нашел, используют $push, но официальные документы, похоже, больше этого не используют, а вместо этого используют MongooseArray.prototype.push(), поэтому я был пытаюсь сослаться на мой как batch.envRecord.push({ tmp, hum })

Да. Я проверил, совпадает ли заголовок, и партию можно найти с помощью

server.get('/batches/:title', async(req, res, next) => {

    try {
      const batch = await Batch.findOne({title: req.params.title});
      res.send(batch);
      next();
    } catch(err) {
      return next(new errors.ResourceNotFoundError(`There is no batch with the title of ${req.params.title}`));
    }
  });

1 Ответ

0 голосов
/ 05 ноября 2018

Вы передаете batch.envRecord.push({ tmp, hum }) в качестве третьего аргумента findOneAndUpdate, который представляет объект параметров запроса. Таким образом, вам нужно нажать на объект только после выполнения findOneAndUpdate и save его. Недостатком этого подхода является выполнение 2 запросов:

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

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

Именно поэтому использование $push является предпочтительным подходом.

...