sql >> Databáze >  >> NoSQL >> MongoDB

Získání unixového časového razítka v sekundách z MongoDB ISODate během agregace

Nejsem si jistý, proč si myslíte, že potřebujete hodnotu v sekundách spíše než v milisekundách, protože obecně platí obě formy a ve většině jazykových implementací jsou milisekundy skutečně preferovány. Ale obecně řečeno, snažit se to vnutit do řetězce je špatný způsob, jak to obejít, a obecně si to spočítáte:

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
        ]}
      ]
    }
  }}
])

Což vám vrátí časové razítko epochy v sekundách. V zásadě odvozené od toho, když je jeden BSON date objekt odečten od jiného, ​​pak je výsledkem časový interval v milisekundách. Použití počátečního data epochy "1970-01-01" má za následek v podstatě extrahování hodnoty milisekund z aktuální hodnoty data. $divide operátor v podstatě odebere část milisekund a $mod dělá modulo implementovat zaokrouhlování.

Ve skutečnosti je lepší dělat práci v nativním jazyce vaší aplikace, protože všechna data BSON se tam vrátí jako nativní typ „datum/datum a čas“, kde můžete extrahovat hodnotu časového razítka. Zvažte základy JavaScriptu v shellu:

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

Obvykle s agregací chcete provést tento druh "matematického výpočtu" s hodnotou časového razítka pro použití v něčem, jako je agregace hodnot v časovém období, jako je den. V rámci agregačního rámce jsou k dispozici datové operátory, ale můžete to udělat také matematickým způsobem:

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 }
    }}
])

Tato forma by byla typičtější pro vysílání časového razítka zaokrouhleného na den a agregaci výsledků v těchto intervalech.

Takže váš účel agregačního rámce jen pro extrakci časového razítka se nezdá být nejlepším využitím nebo by ve skutečnosti nemělo být nutné převádět to na sekundy spíše než na milisekundy. Myslím si, že v kódu vaší aplikace byste to měli dělat, pokud samozřejmě nechcete výsledky za časové intervaly, kde můžete použít matematiku data, jak je uvedeno.

Metody existují, ale pokud ve skutečnosti neagregujete, pak by to byla nejhorší možnost výkonu pro vaši aplikaci. Místo toho proveďte převod v kódu.




  1. phpredis na fedoře 12

  2. Vysoká dostupnost s Redis Sentinel:Připojení k Redis Master/Slave sadám

  3. Rozdíl mezi count() a find().count() v MongoDB

  4. Jak lze seznamy Redis použít k implementaci chatovacího systému?