Oczywiście możesz po prostu użyć $push
i $first
w $group
aby przywrócić dokument do stanu, w jakim był:
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" }
}}
])
Ale prawdopodobnie powinieneś był po prostu użyć $filter
z MongoDB 3.2 na pierwszym miejscu:
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") ] }
]
}
}
}
}}
])
A jeśli masz przynajmniej MongoDB 2.6, nadal możesz użyć $map
i $setDifference
zamiast tego:
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]
]
}
}}
])
Jest to całkowicie w porządku, gdy każdy element tablicy ma już „unikalny” identyfikator, więc operacja „ustaw” po prostu usuwa false
wartości z $map
.
Oba te sposoby „filtrowania” treści z tablicy bez faktycznego używania $unwind
Uwaga :Nie jestem pewien, czy naprawdę rozumiesz, że $in
służy do dopasowania "listy warunków" zamiast konieczności dopasowania w tablicach. Tak więc ogólnie warunek może być następujący:
"matchData.matchId": ObjectId("57175c25561d87001e666d12")
Gdzie w rzeczywistości masz tylko jedną wartość do dopasowania. Używasz $in
i $or
kiedy masz „listę” warunków. Same tablice nie mają znaczenia dla wymaganego operatora.