Nå, du kan selvfølgelig bare bruge $push
og $first
i en $group
for at få dokumentet tilbage til, hvad det var:
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" }
}}
])
Men du skulle nok lige have brugt $filter
med MongoDB 3.2 i første omgang:
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") ] }
]
}
}
}
}}
])
Og hvis du havde mindst MongoDB 2.6, kunne du stadig have brugt $map
og $setDifference
i stedet:
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]
]
}
}}
])
Det er helt fint, når hvert array-element allerede har en "unik" identifikator, så "set"-operationen fjerner bare false
værdier fra $map
.
Begge disse er måder at "filtrere" indhold fra et array uden faktisk at bruge $unwind
NB :Ikke sikker på, om du virkelig forstår det $in
bruges til at matche en "liste over betingelser" snarere end at være forpligtet til at matche på arrays. Så generelt kan tilstanden bare være:
"matchData.matchId": ObjectId("57175c25561d87001e666d12")
Hvor du faktisk kun har en enkelt værdi at matche på. Du bruger $in
og $or
når du har en "liste" over betingelser. Arrays i sig selv gør ingen forskel for den krævede operatør.