MongoDB
 sql >> Baza danych >  >> NoSQL >> MongoDB

Agregat Mongodb (liczba) na wielu polach jednocześnie

Struktura agregacji nie tworzy kluczy na podstawie danych, ani powinna robisz to nawet, ponieważ „dane” nie są kluczem, ale faktycznie danymi, więc powinieneś trzymać się wzorca.

Oznacza to, że możesz po prostu zrobić to:

db.data.aggregate([
    { "$group": {
        "_id": {
            "event_type": "$event",
            "day": { "$dayOfWeek": "$date" }
        },
        "count": { "$sum": 1 } 
    }}
])

A to zliczy wystąpienia na dzień tygodnia na zdarzenie, aczkolwiek w wielu dokumentach w wyniku, ale można to łatwo zmienić na jeden dokument na zdarzenie:

db.data.aggregate([
    { "$group": {
        "_id": {
            "event_type": "$event",
            "day": { "$dayOfWeek": "$date" }
        },
        "count": { "$sum": 1 } 
    }},
    { "$group": {
        "_id": "$_id.event_type",
        "days": { "$push": { "day": "$_id.day", "count": "$count" } }
    }}
])

I to jest w formie tablicy, ale nadal zawiera żądane wyniki.

Jeśli naprawdę chcesz wykonać dokładny formularz, chcesz zrobić coś takiego:

db.data.aggregate([
    { "$group": {
        "_id": "$event",
        "1": {
            "$sum": {
                "$cond": [
                    { "$eq": [{ "$dayOfWeek": "$date" }, 1 ] },
                    1,
                    0
                ]
            }
        },
        "2": {
            "$sum": {
                "$cond": [
                    { "$eq": [{ "$dayOfWeek": "$date" }, 2 ] },
                    1,
                    0
                ]
            }
        },
        "3": {
            "$sum": {
                "$cond": [
                    { "$eq": [{ "$dayOfWeek": "$date" }, 3 ] },
                    1,
                    0
                ]
            }
        },
        "4": {
            "$sum": {
                "$cond": [
                    { "$eq": [{ "$dayOfWeek": "$date" }, 4 ] },
                    1,
                    0
                ]
            }
        },
        "5": {
            "$sum": {
                "$cond": [
                    { "$eq": [{ "$dayOfWeek": "$date" }, 5 ] },
                    1,
                    0
                ]
            }
        },
        "6": {
            "$sum": {
                "$cond": [
                    { "$eq": [{ "$dayOfWeek": "$date" }, 6 ] },
                    1,
                    0
                ]
            }
        },
        "7": {
            "$sum": {
                "$cond": [
                    { "$eq": [{ "$dayOfWeek": "$date" }, 7 ] },
                    1,
                    0
                ]
            }
        }
    }}
)

Ale to jest naprawdę długie, więc IMHO trzymałbym się pierwszego, a może drugiego rozwiązania, ponieważ są one krótsze i łatwiejsze do odczytania.



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Wiele operacji grupowych przy użyciu platformy agregacji Mongo

  2. Jak ustawić klucz podstawowy w MongoDB?

  3. MongoDB $toDecimal

  4. Powstrzymać mongodb przed ignorowaniem znaków specjalnych?

  5. Automatycznie usuwaj obiekty odniesienia po usunięciu w MongoDB