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

Agregacja MongoDB z sumą wartości tablicy

Aby osiągnąć swoje potrzeby dzięki frameworkowi agregacji, pierwszym etapem potoku będzie $match operacja na danym pasażerze, która dopasowuje dokumenty do użytkownika w tablicy pasażera, po której następuje $unwind operacja, która dekonstruuje tablicę pasażerów z dokumentów wejściowych w poprzedniej operacji, aby wyprowadzić dokument dla każdego elementu. Kolejny $match następuje operacja na zdekonstruowanej tablicy, która dodatkowo filtruje poprzedni strumień dokumentów, aby tylko pasujące dokumenty mogły przejść w niezmienionej postaci do następnego etapu potoku, czyli rzutowania wymaganych pól za pomocą $project operator. Tak więc zasadniczo Twój potok agregacji dla user3 będzie jak:

db.collection.aggregate([
     {
        "$match": {
            "passengers.user": "user3"
        }
     },
     {
         "$unwind": "$passengers"
     },
     {
        "$match": {
            "passengers.user": "user3"
        }
     },
     {
         "$project": {
             "_id": 0,
            "driver": "$driver",
            "times": "$passengers.times"
        }
     }
])

Wynik :

/* 0 */
{
    "result" : [ 
        {
            "driver" : "user1",
            "times" : 3
        }, 
        {
            "driver" : "user2",
            "times" : 2
        }
    ],
    "ok" : 1
}

AKTUALIZACJA :

Do grupowania duplikatów na sterownikach z różnymi datami, jak wspomniałeś, możesz zrobić $group operacja tuż przed ostatnim $project etap potoku, w którym obliczasz całkowity czas pasażerów za pomocą $sum operator:

db.collection.aggregate([
     {
        "$match": {
            "passengers.user": "user3"
        }
     },
     {
         "$unwind": "$passengers"
     },
     {
        "$match": {
            "passengers.user": "user3"
        }
     },
     {
         "$group": {
             "_id": "$driver", 
             "total": {
                 "$sum": "$passengers.times"
             }
         }
     },
     {
         "$project": {
            "_id": 0,
            "driver": "$_id",
            "total": 1
        }
     }
])

Wynik :

/* 0 */
{
    "result" : [ 
        {
            "total" : 2,
            "driver" : "user2"
        }, 
        {
            "total" : 3,
            "driver" : "user1"
        }
    ],
    "ok" : 1
}



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Jak mogę połączyć wiele kolekcji w jedną kolekcję za pomocą $lookup mongodb lub nodejs mongodb?

  2. mongodb 3.4.3 Odmowa uprawnień błąd 267 wiredtiger_kv_engine.cpp z ubuntu 16

  3. Jak uruchomić Mongo DB z systemu Windows?

  4. Opcje konfiguracji środowiska wykonawczego ClusterControl

  5. Problemy z uruchamianiem przykładów w Meteor