sql >> Databasteknik >  >> NoSQL >> MongoDB

MongoDb Hur man grupperar efter månad och år från sträng

Du kan inte använda operatorerna för datumaggregation på allt annat som är ett Date objektet självt. Ditt bästa alternativ är att konvertera dessa "strängar" till korrekta Date objekt så att du kan fråga korrekt i denna och framtida operationer.

Som sagt, om dina "strängar" alltid har en gemensam struktur så finns det ett sätt att göra detta med aggregationsramverk verktyg. Det kräver mycket manipulationstänkande som inte gör detta till ett "optimalt" tillvägagångssätt för att hantera problemet. Men med en uppsättning struktur med "dubbla siffror" och en konsekvent avgränsare är detta möjligt med $substr operatör:

db.collection.aggregate([
   { "$group": {
       "_id": {
           "year": { "$substr": [ "$dateStr", 7, 4 ] },
           "month": { "$substr": [ "$dateStr", 4, 2 ] }
       },
       "count": { "$sum": 1 }
   }}
])

Så JavaScript-casting fungerar inte inom aggregeringsramverket. Du kan alltid "mata" indata till pipelinen baserat på "klientkod"-utvärdering, men själva aggregeringsprocessen utvärderar ingen kod. Precis som den grundläggande frågemotorn är allt detta baserat på en "datastruktur"-implementering som använder "native operator"-instruktioner för att utföra arbetet.

Du kan inte konvertera strängar till datum i aggregeringspipelinen. Du bör arbeta med riktiga BSON Date objekt, men du kan göra det med strängar om det finns ett konsekvent format som du kan presentera i en "lexikal ordning".

Jag föreslår fortfarande att du konverterar dessa till BSON Date SÅ FORT SOM MÖJLIGT. Och se upp att "ISODate" eller UTC-värdet är konstruerat med en annan strängform. dvs:

new Date("2020-01-07")

I formatet "åååå-mm-dd". Åtminstone för JavaScript-anropet.




  1. TypeError:db.collection är inte en funktion, KAN INTE GET

  2. MongoDB $anyElementTrue

  3. Hur får man Redis att börja på Heroku?

  4. Mongo's Cursor.nextObject Returnerar ibland felaktigt noll?