2010-11-04 4 views
4

Je suis en train d'écrire un utilitaire au travail qui convertit notre base de données relationnelle au travail en un objet JSON complexe et des dumps vers des fichiers groupés par sujet. Je voudrais ensuite importer ces fichiers dans les collections MongoDB en utilisant l'outil mongoimport.Dates MongoImport se produisant avant l'époque

Nos données incluent les horodatages qui représentent les dates antérieures à l'époque, dont la représentation JSON appropriée donne des nombres négatifs. Alors que MongoDB lui-même va gérer ces problèmes, l'analyseur JSON des outils d'importation utilise les variables unsigned long long et échoue.

Si vous utilisez le format de représentation de date JSON spécial de Mongo ({"key": { "$date": "value_in_ticks" } }), l'outil d'importation émet une erreur sur ces documents et ignore l'importation. Vous pouvez également utiliser la notation de date JavaScript ({"key": new Date(value_in_ticks) }) qui sera importée mais analysée comme une valeur non signée créant une date de vidage.

Le format de date spécial échoue en raison d'un assertion checking for reserved words. Ce code est atteint parce que la présence du signe négatif au début de la valeur provoque l'extraction de l'analyse de date spéciale et le retour à l'analyse normale des documents.

Le code to parse JSON dates appelle explicitement la bibliothèque d'amélioration uint_parser. Il existe une version signée de cette fonction et un issue on their JIRA tracker existe déjà pour l'utiliser (sur lequel j'ai commenté que je tenterais).

À moins de plonger immédiatement dans le code pour essayer de mettre à jour ce code à signer, y a-t-il un autre itinéraire que je peux prendre pour charger ces dates pour le moment?

Je veux courir ce soir via cron pendant quelques mois pour tester, donc je préférerais que ce soit très facile. Ces dates existent dans de nombreuses parties différentes de documents dans de nombreuses collections différentes, de sorte que la solution devrait être généralisée.

+0

Bien que je n'ai pas de réponse, +1 pour une question bien écrite. – UnkwnTech

Répondre

0

Un peu en retard à la fête, mais je viens de faire face au même problème.

Ma solution était d'importer les dates que les chaînes (par exemple « 01/01/1950 »), et la conversion de script en utilisant Ruby on Rails avec MongoId:

Dates.each do |d| 
    d.mydate = d.mydate.to_date 
    d.save 
end 

Espérons que vous pouvez adapter ce à tout langue/cadre que vous utilisez.

+0

Lors d'une inspection plus serrée, les dates incriminées étaient celles qui avaient été placées arbitrairement dans le passé pour simplement les retirer du calcul actuel du rapport. Nous les avons simplement mis à jour le 1er janvier 1970. –

-2

Étape 1: aller à groups.google.com/group/mongodb-user et poster la question « mongoimport ne supporte pas les dates avant l'époque ». Les temps de réponse sur les groupes ont tendance à être très bons.

Étape 2: penser à courir les dates dans un format universellement accepté comme « 25/04/1964 13:23:12 »

Il faudra un peu plus d'espace dans MongoDB parce que vous serez chaîne de stockage. Cependant, il devrait être facile à interpréter pour quiconque tire les données.

0

Cet extrait de Python fonctionne pour moi.

import time, struct 

def bson_datetime(adatetime): 
    try: 
     ret = int(1000*(time.mktime(adatetime.timetuple()) + 3600)) 
     if ret < 0: 
      ret = struct.unpack('Q', struct.pack('q', ret))[0] 
     return {'$date': ret} 
    except ValueError: 
     return None 

I.e.

import datetime 
print bson_datetime(datetime.datetime(1950, 12, 30, 0, 0)) 

rendements { "abc": { "$ date": 18446743473920751616}}.

Questions connexes