Bem, é claro que você pode usar
$push
e $first
em um $group
para obter o documento de volta ao que 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" }
}}
])
Mas você provavelmente deveria ter usado apenas
$filter
com o MongoDB 3.2 em primeiro lugar: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 você tivesse pelo menos o MongoDB 2.6, ainda poderia ter usado
$map
e $setDifference
em vez de: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]
]
}
}}
])
Isso está perfeitamente bem quando cada elemento do array já tem um identificador "único", então a operação "set" apenas remove o
false
valores de $map
. Ambas são maneiras de "filtrar" o conteúdo de uma matriz sem realmente usar
$unwind
N.B :Não tenho certeza se você realmente entende isso
$in
é usado para corresponder a uma "lista de condições" em vez de ser obrigado a corresponder em matrizes. Então, geralmente, a condição pode ser apenas: "matchData.matchId": ObjectId("57175c25561d87001e666d12")
Onde você realmente tem apenas um único valor para corresponder. Você usa
$in
e $or
quando você tem uma "lista" de condições. Os próprios arrays não fazem diferença para o operador necessário.