もちろん、 $ 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
を使用する必要があります。
そもそもMongoDB3.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]
]
}
}}
])
すべての配列要素がすでに「一意の」識別子を持っている場合、これはまったく問題ありません。したがって、「設定」操作は false
を削除するだけです。 $ map
の値 。
を実際に使用せずに、配列からコンテンツを「フィルタリング」する方法はどちらも $ unwind
N.B : $ in
>
「条件のリスト」と照合するために使用されます 配列で一致する必要はありません。したがって、一般的に条件は次のようになります。
"matchData.matchId": ObjectId("57175c25561d87001e666d12")
実際に一致する値が1つしかない場合。 $ in
を使用します および$または
条件の「リスト」がある場合。配列自体は、必要な演算子に違いはありません。