Samozřejmě můžete použít pouze $push
a $first
v $group
abyste získali dokument zpět do stavu, v jakém byl:
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" }
}}
])
Pravděpodobně jste ale měli použít $filter
s MongoDB 3.2 na prvním místě:
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 pokud jste měli alespoň MongoDB 2.6, stále jste mohli použít $map
a $setDifference
místo toho:
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]
]
}
}}
])
To je naprosto v pořádku, když každý prvek pole již má „jedinečný“ identifikátor, takže operace „set“ pouze odstraní false
hodnoty z $map
.
Oba jsou způsoby, jak „filtrovat“ obsah z pole bez skutečného použití $unwind
N.B :Nejsem si jistý, jestli opravdu rozumíte tomu $in
se používá pro shodu se "seznamem podmínek" místo toho, aby bylo vyžadováno, aby se shodovaly na polích. Obecně tedy podmínka může být:
"matchData.matchId": ObjectId("57175c25561d87001e666d12")
Kde ve skutečnosti máte pouze jedinou hodnotu, se kterou se můžete porovnat. Používáte $in
a $or
když máte "seznam" podmínek. Pole sama o sobě neznamenají žádný rozdíl pro požadovaný operátor.