MongoDB
 sql >> डेटाबेस >  >> NoSQL >> MongoDB

मोंगोडब में कुल मिलाकर पूर्ववत करें

ठीक है, आप निश्चित रूप से केवल $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 . का उपयोग करते हैं और $या जब आपके पास शर्तों की "सूची" हो। सरणी स्वयं आवश्यक ऑपरेटर को कोई फर्क नहीं पड़ता।




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. गोलंग / एमजीओ - घबराहट:कोई पहुंच योग्य सर्वर नहीं

  2. GraphQL स्कीमा परिभाषाओं में हाइफ़न को कैसे संभालें

  3. @ क्वालिफायर के साथ समस्याएं

  4. मोंगोडब में नेस्टेड दस्तावेज़ में घटनाओं की गणना कैसे करें?

  5. मोंगोडीबी में सबसे अधिक बार होने वाले मूल्य को खोजने का सबसे अच्छा तरीका क्या है?