Разбира се, можете просто да използвате $push
и $first
в $group
за да върнете документа към това, което беше:
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" }
}}
])
Но вероятно просто трябваше да използвате $filter
с MongoDB 3.2 на първо място:
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") ] }
]
}
}
}
}}
])
И ако имахте поне MongoDB 2.6, все още можехте да използвате $map
и $setDifference
вместо това:
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]
]
}
}}
])
Това е напълно добре, когато всеки елемент от масива вече има "уникален" идентификатор, така че операцията "set" просто премахва false
стойности от $map
.
И двата начина за „филтриране“ на съдържание от масив, без всъщност да използвате $unwind
N.B :Не съм сигурен дали наистина разбирате това $in
се използва за съпоставяне на "списък с условия" вместо да се изисква съвпадение на масиви. Така че най-общо условието може да бъде просто:
"matchData.matchId": ObjectId("57175c25561d87001e666d12")
Където всъщност имате само една стойност, с която да съпоставите. Използвате $in
и $or
когато имате "списък" с условия. Самите масиви нямат значение за необходимия оператор.