Ovviamente puoi semplicemente usare $push
e $first
in un $group
per riportare il documento a quello che era:
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" }
}}
])
Ma probabilmente avresti dovuto usare $filter
con MongoDB 3.2 in primo luogo:
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") ] }
]
}
}
}
}}
])
E se avessi almeno MongoDB 2.6, avresti comunque potuto usare $map
e $setDifference
invece:
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]
]
}
}}
])
Va benissimo quando ogni elemento dell'array ha già un identificatore "univoco", quindi l'operazione "set" rimuove semplicemente il false
valori da $map
.
Entrambi sono modi per "filtrare" il contenuto da un array senza utilizzare effettivamente $unwind
NB :Non sono sicuro di capire davvero che $in
viene utilizzato per corrispondere a un "elenco di condizioni" invece di dover corrispondere sugli array. Quindi generalmente la condizione può essere solo:
"matchData.matchId": ObjectId("57175c25561d87001e666d12")
Dove in realtà hai solo un singolo valore su cui abbinare. Usi $in
e $or
quando hai una "lista" di condizioni. Gli array stessi non fanno alcuna differenza per l'operatore richiesto.