sql >> Database >  >> NoSQL >> MongoDB

5 manieren om de milliseconden van een datum in MongoDB te krijgen

Dit artikel presenteert 5 manieren om het millisecondengedeelte van een Date-object in MongoDB te retourneren.

Voorbeeldgegevens

Stel dat we een verzameling hebben met de naam cats met de volgende documenten:

{ "_id" : 1, "name" : "Scratch", "born" : ISODate("2021-01-03T23:30:15.123Z") }
{ "_id" : 2, "name" : "Meow", "born" : ISODate("2019-12-08T04:00:20.112Z") }
{ "_id" : 3, "name" : "Fluffy", "born" : ISODate("2020-09-24T10:45:01.007Z") }

De volgende voorbeelden demonstreren verschillende opties voor het retourneren van het millisecondengedeelte van de born veld van die documenten.

De $millisecond Operator

De $millisecond operator is speciaal ontworpen om een ​​document terug te sturen met het millisecondengedeelte van een bepaalde datum.

We kunnen de volgende code uitvoeren om het millisecondengedeelte van de born . te retourneren veld in bovenstaand document.

db.cats.aggregate(
  [
    {
      $project:
        {
          _id: 0,
          birthMillisecond: { $millisecond: "$born" }
        }
    }
  ]
)

Resultaat:

{ "birthMillisecond" : 123 }
{ "birthMillisecond" : 112 }
{ "birthMillisecond" : 7 }

De $millisecond operator accepteert ook een timezone argument.

Zie MongoDB $millisecond voor meer informatie en voorbeelden.

De $dateToString Operator

De $dateToString operator converteert een datumobject naar een string volgens een door de gebruiker gespecificeerd formaat. De gebruiker kan daarom specificeren dat alleen het millisecondengedeelte wordt geretourneerd indien nodig.

Er zijn formaatspecificaties voor elk datumgedeelte. De %L formaatspecificatie retourneert het milliseconde-gedeelte (3 cijfers, nul opgevuld).

Voorbeeld:

db.cats.aggregate(
   [
     {
       $project: {
         _id: 0,
          birthMillisecond: { $dateToString: { format: "%L", date: "$born" } }
       }
     }
   ]
)

Resultaat:

{ "birthMillisecond" : "123" }
{ "birthMillisecond" : "112" }
{ "birthMillisecond" : "007" }

Zie MongoDB $dateToString voor meer informatie en voorbeelden.

De $dateToParts Operator

De $dateToParts operator retourneert een document dat de samenstellende delen van een bepaalde BSON-datumwaarde als individuele eigenschappen bevat. De geretourneerde eigenschappen zijn year , month , day , hour , minute , second en millisecond .

We zouden daarom $dateToParts . kunnen gebruiken in één pijplijnfase, voeg vervolgens een andere pijplijnfase toe die de millisecond . extraheert onderdeel.

Dit is wat $dateToParts retouren voor onze drie documenten:

db.cats.aggregate(
  [
    {
      $project:
        {
          _id: 0,
          dateParts: { $dateToParts: { date: "$born" } }
        }
    }
  ]
).pretty()

Resultaat:

{
	"dateParts" : {
		"year" : 2021,
		"month" : 1,
		"day" : 3,
		"hour" : 23,
		"minute" : 30,
		"second" : 15,
		"millisecond" : 123
	}
}
{
	"dateParts" : {
		"year" : 2019,
		"month" : 12,
		"day" : 8,
		"hour" : 4,
		"minute" : 0,
		"second" : 20,
		"millisecond" : 112
	}
}
{
	"dateParts" : {
		"year" : 2020,
		"month" : 9,
		"day" : 24,
		"hour" : 10,
		"minute" : 45,
		"second" : 1,
		"millisecond" : 7
	}
}

Dit resultaat kan vervolgens worden doorgegeven aan de volgende fase in de pijplijn, en we kunnen daarom alleen de millisecond extraheren veld in de volgende fase.

Dit is wat er gebeurt als we nog een projectie toevoegen voor slechts de millisecond veld:

db.cats.aggregate(
  [
    {
      $project:
        {
          _id: 0,
          dateParts: { $dateToParts: { date: "$born" } }
        }
    },
    {
      $project:
        {
          birthMillisecond: "$dateParts.millisecond"
        }
    }
  ]
)

Resultaat:

{ "birthMillisecond" : 123 }
{ "birthMillisecond" : 112 }
{ "birthMillisecond" : 7 }

Dus, wanneer u $dateToParts . gebruikt in je pijplijn zit, heb je toegang tot de millisecond veld (en de andere datumdelen) in de volgende fase.

Zie MongoDB $dateToParts voor meer informatie en voorbeelden.

De forEach() Methode

U kunt cursor.forEach() . gebruiken om door de cursor te lopen, met behulp van een JavaScript-methode zoals getMilliseconds() of getUTCMilliseconds() om alleen de milliseconden terug te geven.

db.cats.find().forEach(
  function(c) {
    print(
      c.born.getUTCMilliseconds()
      );
  }
);

Resultaat:

123
112
7

De getUTCSeconds() De JavaScript-methode retourneert een geheel getal tussen 0 en 999, dat het millisecondengedeelte van het opgegeven datumobject vertegenwoordigt.

De getMilliseconds() methode geeft het terug in lokale tijd.

U zult misschien ook merken dat de vorige opties een heel document retourneren dat een naam/waarde-paar bevat, terwijl deze optie alleen de werkelijke millisecondenwaarde retourneert en niet het hele document.

De map() Methode

De cursor.map() methode past een functie toe op elk document dat door de cursor wordt bezocht en combineert de waarden in een array.

Voorbeeld:

db.cats.find().map(
  function(c) {
    c = c.born.getUTCMilliseconds();
    return c;
  }
);

Resultaat:

[ 123, 112, 7 ]


  1. Hoe een gesorteerde set objecten in redis op te slaan?

  2. MongoDB select count (distinct x) op een geïndexeerde kolom - tel unieke resultaten voor grote datasets

  3. Hoe zorg je ervoor dat Redis voor slechts enkele sleutels een LRU-uitzettingsbeleid kiest?

  4. Celery gebruiken voor realtime, synchrone externe API-query's met Gevent