ठीक है, आप निश्चित रूप से केवल $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 होता, तो भी आप $नक्शा
और $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
. से मान ।
वे दोनों वास्तव में का उपयोग किए बिना किसी सरणी से सामग्री को "फ़िल्टर" करने का एक तरीका है। $अनविंड
नायब :सुनिश्चित नहीं हैं कि आप वास्तव में उस $in
"शर्तों की सूची" . से मेल खाने के लिए प्रयोग किया जाता है सरणियों पर मिलान करने के लिए आवश्यक होने के बजाय। तो आम तौर पर हालत बस हो सकती है:
"matchData.matchId": ObjectId("57175c25561d87001e666d12")
जहां आपके पास वास्तव में मिलान करने के लिए केवल एक ही मूल्य है। आप $in
. का उपयोग करते हैं और $या
जब आपके पास शर्तों की "सूची" हो। सरणी स्वयं आवश्यक ऑपरेटर को कोई फर्क नहीं पड़ता।