maximsohryakov
@maximsohryakov
MiMEKiZ

Update в mongoose не обновляет поля?

Имею модель:
const mongoose = require('mongoose');

let categorySchema = mongoose.Schema({
  price: Number,
  square: Number,
  prestige: Number,
  ecoSituation: String,
  transport: Array,
  typeOfHouse: String,
  numberOfRooms: Number,
  updated: Date,
  upgraded: Date
});

let apartment = mongoose.model('apartments', categorySchema);
module.exports = apartment;


Моя цель: создавать новое поле в данной схеме. Имя и дефолтное значение я получаю через post запрос.
Что я пытался сделать:
код модуля
const apartment = require('../models/apartment');

class AddNewCategory {

  constructor() {}

  newCategory(req, callback) {
    let catName = req.body.name;
    let default_ = req.body.default;

    apartment.where()
        .setOptions({ multi: true })
        .update({ $set: { 'ar': 'asd' }}, (err, result) => {
          if(err) {
            console.error("err => " + err);
          } else {
            console.log(result);
            callback();
          }
        });

    apartment.findOne({}, (err, apart) => {
      apartment.update(apart, {$set: {arrr: 'asd'}}, (err, result) => {
        if(err) {
          console.error("err => " + err);
        } else {
          console.log(result);
          callback();
        }
      })
    });

    apartment.update({}, {$set: {catName: default_}}, {multi:true}, (err, result) => {
      if(err) {
        console.error("err => " + err);
      } else {
        console.log(result);
        callback();
      }

    }).exec();
  }
}

module.exports = AddNewCategory;


Перебрал все способы, которые удалось загуглить. Ни один способ не подошел. На все выходной результат:
{ ok: 0, n: 0, nModified: 0 }


Пробовал в условии поиска записей вместо {} задавать и _id одной из записей, так и одно из полей, которое гарантированно есть в базе. На всё возвращается, что не было найдено ни одной записи, а значит ничего не было обновлено.

p.s. Если через консоль прописать
db.apartments.update({}, {$set: {asd: "Tom"}}, {multi:true})
, то запись успешно обновляется
WriteResult({ "nMatched" : 4, "nUpserted" : 0, "nModified" : 4 })


p.s.
одна из записей
{
"_id" : ObjectId("5c4c4a62d1160f1eeece7aa8"),
"transport" : [
"24",
"35"
],
"price" : 12,
"square" : 23,
"ecoSituation" : "5",
"typeOfHouse" : "house",
"numberOfRooms" : 12,
"updated" : ISODate("2019-01-26T11:54:10.927Z"),
"upgraded" : ISODate("2019-01-26T11:54:10.927Z"),
"__v" : 0,
"asd" : "Tom"
}
{
"_id" : ObjectId("5c4c4b3cd1160f1eeece7aa9"),
"transport" : [
"24"
],


p.s.s. наличие .exec() не давало никакого результата. Как с наличием колбека, так и без, exec() тоже не давал ничего.
p.s.s.s. чувствую, что ответ где-то на поверхности, но не могу уловить, где именно.
  • Вопрос задан
  • 696 просмотров
Решения вопроса 1
maximsohryakov
@maximsohryakov Автор вопроса
MiMEKiZ
Спустя сутки, получилось сделать задуманное, только используя костыль вида:
spoiler
apartment.find({}, (err, apart) => {
      if(err) return new Error('Error in find');

      apart.forEach((v, k, apart) => {
        apartment.findByIdAndUpdate(apart[k]._id, {$set: { dsfgfdg: 'fff'}}, {strict: false, new: true}, (err, ap) => {
          if(err) return new Error('Error in save');
          console.log(ap);
          ap.save((err, ress) => {
            //console.log(ress);
          });
        });
      });
    });


Вся суть была в свойстве
strict: false


Что говорится в документации:
Ответ
The strict option, (enabled by default), ensures that values passed to our model constructor that were not specified in our schema do not get saved to the db.

Строгая опция (включена по умолчанию) гарантирует, что значения, переданные в конструктор модели, которые не были указаны в нашей схеме, не будут сохранены в БД.



Не знаю, оставлять ли, или удалять. Может быть пригодиться кому.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы