Сценарий Mongo Shell для изменения DateTime на valueOf () в миллисекундах, эпоха - PullRequest
0 голосов
/ 08 февраля 2019

Поскольку GraphQL не использует скаляр DateTime, я решил преобразовать все поля в моих коллекциях баз данных MongoDB, имеющих тип DateTime, в Integer, представляющий DateTime в виде миллисекунд.У меня есть около 8 000+ документов, которые необходимо изменить, и я создал сценарий для выполнения этой работы.

Сценарий должен был создать новое поле publid, целочисленное скалярное значение, соответствующее полю «опубликовано».,Когда я загрузил свой сценарий, все документы были перезаписаны, оставив только поле DateTime - хотя, как я и предполагал, в миллисекундах - но все остальные поля, такие как «title», «image», «body», «субтитры », включая другие типы DateTime, такие как« измененный »и« созданный »и т. д. были удалены.

Ниже приведен скрипт, который я запустил:

db.Post.find().forEach(function(myDoc) {
  let currentDate = new Date(myDoc.published);
  print(currentDate);
  db.Post.update(
     { published: currentDate },
     { publishedID: currentDate.valueOf() }
  );
});

Я надеялся, что ISO DateTimesРанее установленное для «опубликованного» поля было бы просто преобразовано в миллисекунды, я понял.Но я не хотел, чтобы все остальное в документе было удалено.

1 Ответ

0 голосов
/ 08 февраля 2019

Здесь вам не хватает оператора $set в запросе на обновление, который является основной причиной удаления всех полей в документах.

db.Post.find().forEach(function(myDoc) {
  let currentDate = new Date(myDoc.published);
  print(currentDate);
  db.Post.update(
     { published: currentDate },
     { $set: {publishedID: currentDate.valueOf()} } // $set: {} added
  );
});

$set оператор обновляет данные поля, но здесь мы имеемдобавлено только одно поле, которое заменит существующие поля в соответствующих коллекциях.

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