MongoDB
 sql >> база данни >  >> NoSQL >> MongoDB

MongoDB Агрегация със сума от стойности на масива

За да постигнете нуждите си с рамката за агрегиране, първият етап на конвейера ще бъде $match операция на въпросния пътник, която съпоставя документите с потребителя в масива от пътници, последвана от $unwind операция, която деконструира масива от пътници от входните документи в предишната операция, за да изведе документ за всеки елемент. Друго $match следва операцията върху деконструирания масив, която допълнително филтрира предишния поток от документи, за да позволи само съвпадащите документи да преминат непроменени в следващия етап на конвейера, който проектира задължителните полета с $project оператор. Така че по същество вашият конвейер за агрегиране за user3 ще бъде като:

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

Резултат :

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

АКТУАЛИЗИРАНЕ :

За групиране на дубликати на драйвери с различни дати, както споменахте, можете да направите $group операция точно преди последния $project етап на тръбопровода, където изчислявате общия брой пътници с помощта на $sum оператор:

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
        }
     }
])

Резултат :

/* 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. Mongoose - използване на Populate върху масив от ObjectId

  2. Как да конвертирам от тип данни низ към дата?

  3. MongoDB сортиране

  4. Как да съхранявате полето за дата като ISODate() с помощта на jackson в MongoDb

  5. Умножете полето по стойност в Mongodb