Jo, du kan naturligtvis bara använda $push
och $first
i en $group
för att få dokumentet tillbaka till vad 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 borde förmodligen bara ha använt $filter
med MongoDB 3.2 i första hand:
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") ] }
]
}
}
}
}}
])
Och om du hade åtminstone MongoDB 2.6, kunde du fortfarande ha använt $map
och $setDifference
istället:
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 är helt okej när varje arrayelement redan har en "unik" identifierare, så "set"-operationen tar bara bort false
värden från $map
.
Båda dessa är ett sätt att "filtrera" innehåll från en array utan att faktiskt använda $unwind
Obs :Inte säker på om du verkligen förstår det $in
används för att matcha en "lista med villkor" snarare än att behöva matcha på arrayer. Så generellt kan tillståndet bara vara:
"matchData.matchId": ObjectId("57175c25561d87001e666d12")
Där du faktiskt bara har ett enda värde att matcha på. Du använder $in
och $or
när du har en "lista" med villkor. Arrayer i sig gör ingen skillnad för den operatör som krävs.