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

Získejte seznam položek kontrolou více hodnot atributů v MongoDB v golangu

Budete muset použít agregační rámec, kde byste spustili agregační kanál, který nejprve filtruje dokumenty v kolekci na základě venueList ID pomocí $match operátor.

Druhý kanál by znamenal zploštění venueList a sum pole vnořených dokumentů, aby se data v dokumentech dále zpracovávala jako denormalizované záznamy. $unwind operátor je zde užitečný.

Další filtr pomocí $match je nutné po odvinutí, aby do dalšího kanálu byly povoleny pouze dokumenty, které chcete agregovat.

Hlavním kanálem by byl $group fáze operátora, která agreguje filtrované dokumenty za účelem vytvoření požadovaných součtů pomocí operátoru akumulátoru $sum . Pro požadovaný výsledek byste museli použít tenary operátor jako $cond vytvořit nezávislá pole počtu, protože tím bude počet dokumentů přiváděn do $sum výraz v závislosti na hodnotě názvu.

Když to shrneme, zvažte spuštění následujícího kanálu:

db.collection.aggregate([
    { "$match": { "venueList.id": { "$in": ["VID1212", "VID4343"] } } },
    { "$unwind": "$venueList" },
    { "$match": { "venueList.id": { "$in": ["VID1212", "VID4343"] } } },
    { "$unwind": "$venueList.sum" },    
    {
        "$group": {
            "_id": null,
            "linux": {
                "$sum": {
                    "$cond": [ 
                        { "$eq": [ "$venueList.sum.name", "linux" ] }, 
                        "$venueList.sum.value", 0 
                    ]
                }
            },
            "ubuntu": {
                "$sum": {
                    "$cond": [ 
                        { "$eq": [ "$venueList.sum.name", "ubuntu" ] }, 
                        "$venueList.sum.value", 0 
                    ]
                }
            }
        }
    }
])

Pro použití s ​​mGo můžete výše uvedený kanál převést pomocí pokynů v http://godoc.org/labix.org/v2/mgo#Collection.Pipe

Chcete-li flexibilnější a výkonnější alternativu, která se provádí mnohem rychleji než výše uvedená, a také bere v úvahu neznámé hodnoty v seznamu součtů, spusťte alternativní kanál následovně

db.collection.aggregate([
    { "$match": { "venueList.id": { "$in": ["VID1212", "VID4343"] } } },
    { "$unwind": "$venueList" },
    { "$match": { "venueList.id": { "$in": ["VID1212", "VID4343"] } } },
    { "$unwind": "$venueList.sum" },    
    { 
        "$group": {
            "_id": "$venueList.sum.name",
            "count": { "$sum": "$venueList.sum.value" }
        }
    },
    { 
        "$group": {
            "_id": null,
            "counts": {
                "$push": {
                    "name": "$_id",
                    "count": "$count"
                }
            }
        }
    }
])



  1. Dotaz na podobné pole v MongoDB

  2. Upgrade na Ubuntu 15.04 z 14.10 přerušuje mongo - jak to opravit?

  3. Získat pozici vybraného dokumentu v kolekci [mongoDB]

  4. Skript se pokusil vytvořit globální proměnnou