Nun, Sie können natürlich einfach $push
verwenden
und $first
in einem $group
um das Dokument wieder so zu machen, wie es war:
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" }
}}
])
Aber Sie hätten wahrscheinlich einfach $filter
verwenden sollen
mit MongoDB 3.2 an erster Stelle:
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") ] }
]
}
}
}
}}
])
Und wenn Sie mindestens MongoDB 2.6 hätten, hätten Sie immer noch $map
und $setDifference
stattdessen:
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]
]
}
}}
])
Das ist völlig in Ordnung, wenn jedes Array-Element bereits einen „eindeutigen“ Bezeichner hat, sodass die „set“-Operation nur den false
entfernt Werte aus $map
.
Beides sind Möglichkeiten, Inhalte aus einem Array zu „filtern“, ohne tatsächlich zu verwenden $unwind
NB :Nicht sicher, ob Sie diesen $in
wird verwendet, um eine "Liste von Bedingungen" abzugleichen anstatt auf Arrays übereinstimmen zu müssen. Im Allgemeinen kann die Bedingung also einfach lauten:
"matchData.matchId": ObjectId("57175c25561d87001e666d12")
Wo Sie eigentlich nur einen einzigen Wert zum Abgleichen haben. Sie verwenden $in
und $oder
wenn Sie eine "Liste" von Bedingungen haben. Arrays selbst machen für den erforderlichen Operator keinen Unterschied.