Tentu saja Anda bisa menggunakan $push
dan $first
dalam $group
untuk mengembalikan dokumen seperti semula:
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" }
}}
])
Tetapi Anda mungkin harus menggunakan $filter
dengan MongoDB 3.2 di tempat pertama:
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") ] }
]
}
}
}
}}
])
Dan jika Anda memiliki setidaknya MongoDB 2.6, Anda masih dapat menggunakan $map
dan $setDifference
sebagai gantinya:
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]
]
}
}}
])
Itu baik-baik saja ketika setiap elemen array sudah memiliki pengidentifikasi "unik", jadi operasi "set" hanya menghapus false
nilai dari $map
.
Keduanya merupakan cara untuk "memfilter" konten dari array tanpa benar-benar menggunakan $unwind
N.B :Tidak yakin apakah Anda benar-benar memahami $in
digunakan untuk mencocokkan "daftar ketentuan" daripada diminta untuk mencocokkan pada array. Jadi umumnya syaratnya bisa saja:
"matchData.matchId": ObjectId("57175c25561d87001e666d12")
Di mana Anda sebenarnya hanya memiliki satu nilai untuk dicocokkan. Anda menggunakan $in
dan $or
ketika Anda memiliki "daftar" kondisi. Array sendiri tidak ada bedanya dengan operator yang dibutuhkan.