Om aan uw behoeften te voldoen met een aggregatieraamwerk, is de eerste pijplijnfase een $match
bewerking op de betreffende passagier die overeenkomt met de documenten met de gebruiker in de passagiersreeks, gevolgd door de $unwind
bewerking die de passagiersreeks deconstrueert uit de invoerdocumenten in de vorige bewerking om een document voor elk element uit te voeren. Nog een $match
Er volgt een bewerking op de gedeconstrueerde array die de vorige documentstroom verder filtert om alleen overeenkomende documenten ongewijzigd door te laten gaan naar de volgende pijplijnfase, die de vereiste velden projecteert met het $project
exploitant. Dus in wezen uw aggregatiepijplijn voor user3
zal zijn als:
db.collection.aggregate([
{
"$match": {
"passengers.user": "user3"
}
},
{
"$unwind": "$passengers"
},
{
"$match": {
"passengers.user": "user3"
}
},
{
"$project": {
"_id": 0,
"driver": "$driver",
"times": "$passengers.times"
}
}
])
Resultaat :
/* 0 */
{
"result" : [
{
"driver" : "user1",
"times" : 3
},
{
"driver" : "user2",
"times" : 2
}
],
"ok" : 1
}
UPDATE :
Voor het groeperen van duplicaten van stuurprogramma's met verschillende datums, zoals u zei, kunt u een $group
doen operatie net voor het laatste $project
pijplijnfase waarin u de totale passagierstijden berekent met behulp van de $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
}
}
])
Resultaat :
/* 0 */
{
"result" : [
{
"total" : 2,
"driver" : "user2"
},
{
"total" : 3,
"driver" : "user1"
}
],
"ok" : 1
}