MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

Obtention de l'horodatage unix en quelques secondes à partir de MongoDB ISODate lors de l'agrégation

Je ne sais pas pourquoi vous pensez avoir besoin de la valeur en secondes plutôt qu'en millisecondes, car généralement les deux formes sont valides et dans la plupart des implémentations de langage, les millisecondes sont en fait préférées. Mais d'une manière générale, essayer de contraindre ceci dans une chaîne est la mauvaise façon de contourner cela, et généralement vous faites simplement le calcul :

db.data.aggregate([
  { "$project": {
    "timestamp": {
      "$subtract": [
        { "$divide": [
            { "$subtract": [ "$md", new Date("1970-01-01") ] },
            1000
        ]},
        { "$mod": [
          { "$divide": [
              { "$subtract": [ "$md", new Date("1970-01-01") ] },
              1000
          ]},
          1
        ]}
      ]
    }
  }}
])

Ce qui vous renvoie un horodatage d'époque en secondes. Fondamentalement dérivé du moment où un objet de date BSON est soustrait d'un autre, le résultat est l'intervalle de temps en millisecondes. L'utilisation de la date d'époque initiale "1970-01-01" entraîne essentiellement l'extraction de la valeur en millisecondes de la valeur de la date actuelle. Le $divide l'opérateur enlève essentiellement la partie millisecondes et le $mod fait le modulo pour implémenter l'arrondi.

Vraiment, bien que vous feriez mieux de faire le travail dans la langue maternelle de votre application, car toutes les dates BSON y seront renvoyées sous la forme d'un type "date/datetime" natif où vous pourrez extraire la valeur d'horodatage. Tenez compte des bases de JavaScript dans le shell :

var date = new Date()
( date.valueOf() / 1000 ) - ( ( date.valueOf() / 1000 ) % 1 )

Généralement, avec l'agrégation, vous souhaitez effectuer ce type de "calculs" sur une valeur d'horodatage à utiliser dans quelque chose comme l'agrégation de valeurs dans une période de temps telle qu'un jour. Il existe des opérateurs de date disponibles pour le cadre d'agrégation, mais vous pouvez également le faire de manière mathématique :

db.data.aggregate([
    { "$group": {
        "_id": {
          "$subtract": [
              { "$subtract": [ "$md", new Date("1970-01-01") ] },
              { "$mod": [
                  { "$subtract": [ "$md", new Date("1970-01-01") ] },
                  1000 * 60 * 60 * 24
              ]}
          ]
        },
        "count": { "$sum": 1 }
    }}
])

Ce formulaire serait plus typique d'émettre un horodatage arrondi à un jour et d'agréger les résultats dans ces intervalles.

Ainsi, votre objectif du cadre d'agrégation uniquement pour extraire un horodatage ne semble pas être la meilleure utilisation ou, en fait, il ne devrait pas être nécessaire de le convertir en secondes plutôt qu'en millisecondes. Dans votre code d'application, je pense que vous devriez le faire, à moins bien sûr que vous ne vouliez réellement des résultats pour des intervalles de temps où vous pouvez appliquer les calculs de date comme indiqué.

Les méthodes sont là, mais à moins que vous n'agrégiez réellement, ce serait la pire option de performance pour votre application. Effectuez plutôt la conversion dans le code.