Eh bien, vous pouvez bien sûr simplement utiliser $push
et $first
dans un $group
pour redonner au document ce qu'il était :
db.getCollection('matchWiseData').aggregate([
{ "$match":{
"matchData.matchId":{"$in":[ObjectId("57175c25561d87001e666d12")]}
}},
{ "$unwind":"$matchData"},
{ "$match":{
"matchData.matchId":{"$in":[ObjectId("57175c25561d87001e666d12")]}
}},
{ "$group": {
"_id": "$_id",
"venueId": { "$first": "$venueId" },
"companyId": { "$first": "$companyId" },
"cardTypeId": { "$first": "$cardTypeId" },
"matchData": { "$push": "$matchData" }
}}
])
Mais vous auriez probablement dû utiliser $filter
avec MongoDB 3.2 en premier lieu :
db.getCollection('matchWiseData').aggregate([
{ "$match":{
"matchData.matchId":{"$in":[ObjectId("57175c25561d87001e666d12")]}
}},
{ "$project": {
"venueId": 1,
"companyId": 1,
"cardTypeId": 1,
"matchData": {
"$filter": {
"input": "$matchData",
"as": "match",
"cond": {
"$or": [
{ "$eq": [ "$$match.matchId", ObjectId("57175c25561d87001e666d12") ] }
]
}
}
}
}}
])
Et si vous aviez au moins MongoDB 2.6, vous auriez toujours pu utiliser $map
et $setDifference
à la place :
db.getCollection('matchWiseData').aggregate([
{ "$match":{
"matchData.matchId":{"$in":[ObjectId("57175c25561d87001e666d12")]}
}},
{ "$project": {
"venueId": 1,
"companyId": 1,
"cardTypeId": 1,
"matchData": {
"$setDifference": [
{ "$map": {
"input": "$matchData",
"as": "match",
"in": {
"$cond": [
{ "$or": [
{ "$eq": [ "$$match.matchId", ObjectId("57175c25561d87001e666d12") ] }
]},
"$$match",
false
]
}
}},
[false]
]
}
}}
])
C'est parfaitement bien lorsque chaque élément du tableau a déjà un identifiant "unique", donc l'opération "set" supprime simplement le false
valeurs de $map
.
Ces deux moyens de "filtrer" le contenu d'un tableau sans réellement utiliser $unwind
N.B :Je ne sais pas si vous comprenez vraiment que $in
est utilisé pour correspondre à une "liste de conditions" plutôt que d'être obligé de faire correspondre les tableaux. Donc, généralement, la condition peut simplement être :
"matchData.matchId": ObjectId("57175c25561d87001e666d12")
Où vous n'avez en fait qu'une seule valeur à faire correspondre. Vous utilisez $in
et $or
quand vous avez une "liste" de conditions. Les tableaux eux-mêmes ne font aucune différence pour l'opérateur requis.