Tất nhiên, bạn có thể chỉ cần sử dụng $ push
và $ first
trong $ group
để đưa tài liệu trở lại như cũ:
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" }
}}
])
Nhưng có lẽ bạn chỉ nên sử dụng $ filter
với MongoDB 3.2 ở vị trí đầu tiên:
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") ] }
]
}
}
}
}}
])
Và nếu bạn có ít nhất MongoDB 2.6, bạn vẫn có thể sử dụng $ map
và $ setDifference
thay vào đó:
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]
]
}
}}
])
Điều đó hoàn toàn ổn khi mọi phần tử mảng đã có một số nhận dạng "duy nhất", vì vậy thao tác "set" chỉ loại bỏ false
giá trị từ $ map
.
Cả hai cách đó đều là cách để "lọc" nội dung khỏi một mảng mà không thực sự sử dụng $ thư giãn
N.B :Không chắc liệu bạn có thực sự hiểu $ in
được sử dụng để khớp với "danh sách các điều kiện" thay vì bắt buộc phải khớp trên các mảng. Vì vậy, nói chung điều kiện chỉ có thể là:
"matchData.matchId": ObjectId("57175c25561d87001e666d12")
Nơi bạn thực sự chỉ có một giá trị duy nhất để so khớp. Bạn sử dụng $ in
và $ hoặc
khi bạn có một "danh sách" các điều kiện. Bản thân các mảng không tạo ra sự khác biệt đối với toán tử được yêu cầu.