findOneAndUpdate не обновляется - PullRequest
0 голосов
/ 20 декабря 2018

Я пытаюсь обновить один из моих документов, хранящихся на сервере mongoose, используя findOneAndUpdate.Я установил его как запрос PUT, и именно так я его и определил.

public updateConfigWithType(req: Request, res: Response) {
    configs.findOneAndUpdate({'companyInfo.uniquecompanyid': req.params.id}, { $set: { companyName: "ITSWORKING" }} ,(err,doc) => {
        if (err) {
            res.send(err);
        }else {
          res.json({
              message: 'Succesfully updated this item'
          });
        }
    })
}

URL-адрес моего запроса PUT настроен следующим образом: http://localhost:3000/parserConfig/123123wfdwedfwfwefwef

Это небольшой фрагмент данных JSON, которые выходят из моих документов на моем сервере mongoose:

{
    "_id": {
        "$oid": "5bbf27ad4cf8a6be65ea6257"
    },
    "companyInfo": {
        "companyName": "example",
        "hashKey": "sdfsdf",
        "hashFunction": "sdfsdf",
        "uniquecompanyid": "123123wfdwedfwfwefwef"
    },
    "version": "1",
    "__v": 0,
    "parserConfig": {
        "id": {
            "fieldName": "key",
            "path": "key"
    },

Итак, я хочу иметь возможность найти нужный документ по уникальному compnayid, который находится в URL, и я специально хочу ОБНОВИТЬ поле parserConfig с тем, что существует в req.body.На данный момент я жестко запрограммировал все для целей тестирования. Отправка запроса PUT в настоящее время дает мне ответ в Почтальоне:

{"message":"Succesfully updated this item"}

Но ничего не было обновлено.Чего мне не хватает?

Обновление

Я изменил код для целей тестирования ... Вот что я попробовал:

public updateConfigWithType(req: Request, res: Response) {
  var query = {'companyInfo.uniquecompanyid':req.params.id};
  configs.findOneAndUpdate(query, {$set:{'companyInfo.uniquecompanyid':"heheheheh"}}, {new:true}, function(err, doc){
      if (err) {
        return res.send(err);
      }
      return res.send(doc);
  });
}

Ответ почтальона - СТАРЫЙ документ.Ничего не изменилось

ОБНОВЛЕНИЕ после запроса Spyros

10:26:34 PM web.1 |  Mongoose: configs.findOne({ 'companyInfo.uniquecompanyid': '123123wfdwedfwfwefwef' }, { new: true, projection: {} })
10:26:34 PM web.1 |  PUT /parserConfig/123123wfdwedfwfwefwef 200 158.118 ms - 2089

ОБНОВЛЕНИЕ нового информационного уведомления

Я сталкивался с этим:https://github.com/Automattic/mongoose/issues/7011

где написано:

Я заметил, что при вызове findOneAndUpdate со свойством update документа, которого нет в схеме, выходные данные отладки показывают (неправильно)?Метод сбора.

Зачем обновлять то же свойство через Studio 3t, а не через мой код?

Ответы [ 2 ]

0 голосов
/ 30 июня 2019

Начиная с Mongoose v7.6.2, документация гласит:

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

Как и вы, я не могу определить схему для коллекции, так как мои документы сильно различаются.Для меня хитрость заключалась в добавлении strict: false к схеме коллекции.

import { Schema } from 'mongoose';

const DynamicDocumentSchema = new Schema(
  { bar: String },
  { strict: false }
);

POSTSCRIPT

Если кому-то интересно, вы также можете добавить strict: false в запрос на обновлениекак показано нижеЭто переопределяет любое значение strict в схеме.

await DynamicDocumentModel.findByIdAndUpdate(
  docId,
  {
    $set: <whatever_update>
  },
  { strict: false }
);
0 голосов
/ 21 декабря 2018

Включить ведение журнала отладки: mongoose.set('debug', true);.Это покажет вам запросы, которые выполняются.Я думаю, что ошибка может быть связана с неправильным написанием какого-либо атрибута или другого идентификатора объекта.Если это не поможет, обновите ваш вопрос информацией о результате отладки, чтобы я мог обновить свой ответ.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...