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

Analog pro skupinu concat v sql

Podle dosavadních komentářů není jasné, co seskupujete nebo co chcete jako konečný výsledek, kromě toho, že chcete svá data spojit do něčeho jako „jen den“ bez hodin nebo minut dohromady. Pravděpodobně chcete tyto odlišné dny z nějakého důvodu.

Existují různé operátoři data v kanálu, který můžete použít na data, a je to $concat také operátor. Bohužel všichni operátoři data vytvořit jako výsledek celé číslo a pro požadovaný druh řetězce Date $concat bude fungovat pouze se strunami. Dalším problémem je, že nemůžete odesílat celé číslo na typ řetězce v rámci agregace.

Ale můžete použijte dílčí dokumenty, zde budeme pracovat pouze s datem:

db.record.aggregate([
    // Unwind the array to work with it
    {$unwind: "$date"},

    // project into our new 'day' document
    {$project:{ 
        day: { 
            year: {$year: "$date"},
            month: {$month: "$date"}, 
            day: {$dayOfMonth: "$date"}
        }
     } },

     // optionalally sort if date order is important [ oldest -> newest ] 
     {$sort: { "day.year": -1, "day.month": -1, "day.day": -1}},

     // Wind back unique values into the array
     {$group: {_id:"$_id", days: {$addToSet: "$day"} }}
])

Není to tedy řetězec, ale lze jej snadno dodatečně zpracovat do jednoho, ale hlavně je seskupen a seřadit.

Principy zůstávají stejné, pokud chcete jedinečná dates tímto způsobem jako pole na konci nebo zda chcete seskupit součty podle těchto dat. Mějte tedy především na paměti $unwind a $project části pomocí operátorů data.

-UPRAVIT--

S díky komunitě, jak je uvedeno v tomto příspěvku je to nezdokumentováno chování $substr , ve kterém lze celá čísla přetypovat jako řetězce.

db.record.aggregate([
    // Unwind the array to work with it
    {$unwind: "$date"},

    // project into our new 'day' document
    {$project:{ 
        day: { 
            year: {$year: "$date"},
            month: {$month: "$date"}, 
            day: {$dayOfMonth: "$date"}
        }
     } },

     // optionalally sort if date order is important [ oldest -> newest ] 
     {$sort: { "day.year": -1, "day.month": -1, "day.day": -1}},

     // now we are going to project to a string ** magic @heinob **
     {$project: { 
         day: {$concat: [
             {$substr: [ "$day.year", 0, 4 ]},
             "-",
             {$substr: [ "$day.month", 0, 2 ]},
             "-",
             {$substr: [ "$day.day", 0, 2 ]}
         ]}
     }},

     // Wind back unique values into the array
     {$group: {_id:"$_id", days: {$addToSet: "$day"} }}
])

A teď days jsou struny. Jak jsem již poznamenal dříve, pokud je pro vás řazení důležité, pak je nejlepším přístupem promítnout do typu dokumentu tak, jak bylo provedeno, a seřadit pomocí číselných kláves. Přirozeně lze projekt $, který transformuje datum, pro stručnost převést do fáze $group, což je pravděpodobně to, co chcete dělat při práci s celým dokumentem.



  1. Jak přejmenovat/alias pole (pole) při načítání z MongoDB pomocí dotazu pomocí nativní jednotky MongoDB-Node.JS?

  2. MongoDB zapnuté s Dockerem se nepodařilo připojit k serveru [localhost:27017] při prvním připojení

  3. pymongo:název 'ISODate' není definován

  4. MongoError write EPIPE” v instalaci Parse-Server