Преобразование BSON ISODate в NumberLong в MongoDB

#mongodb #date #timestamp #type-conversion #bson

#mongodb #Дата #временная метка #тип-преобразование #bson

Вопрос:

У меня есть коллекция в MongoDB, в которой есть created поля со значениями, которые в настоящее время хранятся как объект BSON ISODate. Я хочу преобразовать все это в объекты NumberLong, содержащие временную метку.

Сначала я попробовал это (в оболочке Mongo):

 db.collection.find( { "created" : { "$type" : 9 } } ).forEach( function (x) {   
  x.created = new NumberLong(x.created);
  db.collection.save(x);
});

JavaScript execution failed: Error: could not convert "Tue Mar 18 2014 18:11:21 GMT-0400 (EDT)" to NumberLong
 

По-видимому, строка даты не может быть приведена как long …достаточно справедливо. Затем я попробовал это, думая, что смогу использовать метод UTC объекта даты Javascript:

 db.collection.find( { "created" : { "$type" : 9 } } ).forEach( function (x) {
  x.created = new Date(x.created).UTC();
  db.collection.save(x);
});

JavaScript execution failed: TypeError: Object Tue Mar 18 2014 18:11:21 GMT-0400 (EDT) has no method 'UTC'
 

Я пробовал несколько других вариантов, но пока ничего не сработало. Любая помощь будет принята с благодарностью!

Ответ №1:

Чтобы получить доступ к базовому числовому значению Date , вы можете вызвать getTime() его:

 x.created = new NumberLong(x.created.getTime());
 

Ответ №2:

Объект ISODate имеет метод «valueOf», который возвращает время эпохи. Вот пример, генерирующий это с помощью оболочки mongo:

 replset:PRIMARY> var date = ISODate()
replset:PRIMARY> date
ISODate("2014-06-25T16:31:46.994Z")
replset:PRIMARY> date.valueOf()
1403713906994
replset:PRIMARY> 
 

Комментарии:

1. Спасибо за ваш ответ. JohnnyHK опередил вас, но ваш ответ также очень полезен. Приветствия!