Nou, je kunt natuurlijk gewoon $push
gebruiken
en $first
in een $group
om het document terug te brengen naar wat het was:
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" }
}}
])
Maar je had waarschijnlijk gewoon $filter
moeten gebruiken
met MongoDB 3.2 in de eerste plaats:
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") ] }
]
}
}
}
}}
])
En als je tenminste MongoDB 2.6 had, had je nog steeds $map
en $setDifference
in plaats daarvan:
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]
]
}
}}
])
Dat is prima als elk array-element al een "unieke" identifier heeft, dus de "set"-bewerking verwijdert gewoon de false
waarden van $map
.
Beide zijn manieren om inhoud uit een array te "filteren" zonder daadwerkelijk gebruik te maken van $unwind
NB :Ik weet niet zeker of je die $in
wordt gebruikt om overeen te komen met een "lijst met voorwaarden" in plaats van te moeten matchen op arrays. Dus over het algemeen kan de toestand gewoon zijn:
"matchData.matchId": ObjectId("57175c25561d87001e666d12")
Waar je eigenlijk maar één waarde hebt om op te matchen. Je gebruikt $in
en $of
wanneer u een "lijst" met voorwaarden heeft. Arrays zelf maken geen verschil voor de vereiste operator.