Невозможно изменить тип поля Mon goose, если он! = Исходное значение - PullRequest
1 голос
/ 05 мая 2020

Мое myId поле - это строка. Я хочу преобразовать его в Number, поэтому я запускаю это (после обновления поля модели Mon goose до Number):

Post.find( { myId : { $exists : true } }).then( function(docs){
  docs.forEach(function (doc) {
    doc.myId = parseInt(doc.myId);
    doc.save();
  })
})

Однако это не работает! myId по-прежнему является строкой в ​​MongoDB Compass.

Он работает только при изменении значения:

Post.find( { myId : { $exists : true } }).then( function(docs){
  docs.forEach(function (doc) {
    doc.myId = parseInt(doc.myId) + 1000; // => This is the only way I can change the field type to Number! What gives?
    doc.save();
  })
})

Почему мне нужно изменить значение, чтобы изменить тип поля ?

Изменить

Если я изменю значение перед сохранением, оно также будет работать:

// This works!
doc.myId = parseInt(doc.myId) + 1;
doc.myId = doc.myId - 1;
doc.save();

1 Ответ

2 голосов
/ 05 мая 2020

Вероятно, это потому, что Mon goose попытается привести тип, хранящийся в MongoDB, к типу, ожидаемому Mon goose. Это означает, что строки уже были преобразованы в число, поэтому Mon goose не обнаруживает никаких изменений, когда вы устанавливаете myId в значение parseInt(), поскольку анализ целочисленного значения возвращает то же целое число.

Самый простой способ сделать то, что вы хотите, - просто пометить поле как измененное, что-то вроде этого (непроверено):

const docs = await Post.find( { myId : { $exists : true } });

await Promise.all(docs.map((doc) => {
  doc.markModified('myId');

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