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

Potřebujete najít nejčastěji se vyskytující hodnotu pole v agregaci

No, nemůžete se jen "nalíčit". operátory jako $mode není operátor agregace a jediné, co můžete použít, jsou ty, které skutečně existují .

Aby se tedy vrátila hodnota kategorie v rámci seskupeného časového období, které se vyskytuje nejčastěji, je nutné seskupit nejprve každou z těchto hodnot a vrátit počet výskytů. Potom můžete tyto výsledky seřadit podle tohoto počtu a vrátit hodnotu kategorie, která zaznamenala nejvyšší počet v daném období:

    // Filter dates
    { "$match": { 
        "dt": { 
            "$gt": new Date("October 13, 2010 12:00:00"), 
            "$lt": new Date("November 13, 2010 12:00:00")
        } 
    }},

    // Group by hour and category, with avg and count
    { "$group": {
        "_id": {
            "dt": {
                "$add": [
                    {
                        "$subtract": [
                            { "$subtract": ["$dt", new Date(0)] },
                            {
                                "$mod": [
                                    { "$subtract": ["$dt", new Date(0)] },
                                    3600000//1000 * 60 * 60
                                ]
                            }
                        ]
                    },
                    new Date(0)
                ]
            },
            "category": "$category"
        }, 
        "price": { "$avg": "$price" },
        "count": { "$sum": 1 }
    }},
    // Sort on date and count
    { "$sort": { "_id.dt": 1, "count": -1 }},

    // Group on just the date, keeping the avg and the first category
    { "$group": {
        "_id": "$_id.dt",
        "price": { "$avg": "$price"}
        "category": { "$first": "$_id.category" }
    }}

Takže $group k datu i kategorii a zachovat počet kategorií prostřednictvím $sum . Potom $sort takže největší "počet" je nahoře pro každé seskupené datum. A nakonec použijte $first když použijete další $group který se použije na samotné datum, aby se vrátila kategorie s největším počtem pro každé datum.

Nenechte se zlákat operátory jako $max protože tady nepracují. Klíčovým rozdílem je „vázaný“ vztah k „záznamu/dokumentu“ vytvořenému pro každou hodnotu kategorie. Nejde tedy o maximální „počet“, který chcete, ani o maximální hodnotu „kategorie“, ale místo toho o hodnotu kategorie, která „vytvořila“ největší počet. Proto existuje $sort potřeba zde.

Konečně některé návyky, které byste „měli“ opustit:

  • Nepoužívejte jako vstup data instance data ve formátu UTC, pokud opravdu nevíte, co děláte. Data budou vždy převedena na UTC, takže alespoň v testovacích výpisech byste si měli zvyknout na zadávání hodnoty data tímto způsobem.

  • Na druhou stranu to může vypadat trochu čistěji, ale věci jako 1000 * 60 * 60 jsou mnohem popisnější kód toho, co dělá, než 3600000 . Stejná hodnota, ale jedna forma na první pohled ukazuje jednotky času.

  • Složení _id když existuje pouze jedna hodnota, může to také zmást. Nemá tedy smysl přistupovat k _id.dt kdyby to byla jediná přítomná hodnota. When je více než jedna vlastnost v rámci _id pak je to v pohodě. Ale jednotlivé hodnoty by měly být přiřazeny přímo zpět k _id sám. Jinak nic nezískalo a singl je celkem jasný.




  1. Jak načíst poslední čas aktualizace každého dokumentu v MongoDB?

  2. Meteor – chyba MongoDB:Nelze použít modifikátor $addToSet na non-array

  3. Jak uložit bajt[] obrázek v mongodb pro proces Doocr

  4. Použití sed na proměnnou xargs nefunguje uvnitř expanze shellu