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

एक साधारण मूल्य या सूची के लिए मोंगो में गतिशील चिपचिपा छँटाई

आपकी त्रुटि को पुन:उत्पन्न नहीं कर सकता लेकिन आपके प्रश्न में कुछ "टाइपो" हैं, इसलिए मैं सुनिश्चित नहीं कर सकता कि आपके पास वास्तव में क्या है।

लेकिन मान लें कि आप वास्तव में MongoDB 2.6 या इसके बाद के संस्करण के साथ काम कर रहे हैं तो आप शायद चाहते हैं। $setIntersection या $setIsSubset ऑपरेटर के बजाय $setUnion . वे ऑपरेटर उस सरणी की सामग्री को "मिलान" करते हैं जिसकी उनकी तुलना की जाती है, जहां $setUnion बस आपूर्ति की गई सरणी को मौजूदा के साथ जोड़ती है:

db.people.aggregate([
    { "$project": {
        "first_name": 1,
        "last_name": 1,
        "sticky": { 
            "$size": { 
                "$setIntersection": [ "$offices", [ "FL", "SC" ]] 
            }
        },
        "offices": 1
    }},
    { "$sort": {
        "sticky": -1,
        "last_name": 1
    }}
])

पिछले संस्करणों में जहां आपके पास वे सेट ऑपरेटर नहीं हैं आप बस $unwind का उपयोग कर रहे हैं सरणी के साथ काम करने के लिए, और उसी तरह का $cond $group यह सब वापस एक साथ लाने के लिए:

db.people.aggregate([
    { "$unwind": "$offices" },
    { "$group": {
        "_id": "$_id",
        "first_name": { "$first": "$first_name" },
        "last_name": { "$first": "$last_name",
        "sticky": { "$sum": { "$cond": [
            { "$or": [
                { "$eq": [ "$offices": "FL" ] },
                { "$eq": [ "$offices": "SC" ] },
            ]},
            1,
            0
        ]}},
        "offices": { "$push": "$offices" }
    }},
    { "$sort": {
        "sticky": -1,
        "last_name": 1
    }}
])

लेकिन आप निश्चित रूप से सही रास्ते पर थे। अपनी सटीक आवश्यकता प्राप्त करने के लिए बस सही सेट ऑपरेशन या अन्य विधि चुनें।

या जब से आप जो चाहते हैं उसे प्राप्त करने का अपना तरीका पोस्ट कर चुके हैं, तो उस तरह का "आदेशित मिलान" लिखने का एक बेहतर तरीका यह है:

db.people.aggregate([
    { "$project": {
        "first_name": 1,
        "last_name": 1,
        "sticky": { "$cond": [
            { "$anyElementTrue": {
                "$map": {
                    "input": "$offices",
                    "as": "o",
                    "in": { "$eq": [ "$$o", "FL" ] }
                }
            }},
            2,
            { "$cond": [
                { "$anyElementTrue": {
                    "$map": {
                        "input": "$offices",
                        "as": "o",
                        "in": { "$eq": [ "$$o", "SC" ] }
                    }
                }},
                1,
                0
            ]}
        ]},
        "offices": 1
    }},
    { "$sort": {
        "sticky": -1,
        "last_name": 1
    }}
])

और यह प्राथमिकता देगा कि यह "कार्यालयों" के साथ "एससी" पर "एफएल" युक्त और इसलिए अन्य सभी पर, और एक ही क्षेत्र में ऑपरेशन कर रहा है। लोगों के लिए यह देखना भी बहुत आसान होना चाहिए कि $अनविंड करें सेट ऑपरेटरों के बिना पुराने संस्करणों में। जहां आप $cond बयान।



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. क्या मोंगोडब के बिना _id स्ट्रिंग्स जैसे मोंगोडब बनाने का कोई तरीका है?

  2. C# MongoDB ड्राइवर का उपयोग करके फ़ील्ड का सबसेट कैसे प्राप्त करें?

  3. नेवला खाली वस्तुओं या सरणियों को हटा दें

  4. Mongodb पुनरावर्ती क्वेरी $graphLookup . के साथ अपेक्षित रूप से काम नहीं कर रही है

  5. PHP54+ Nginx + PHPFPM + MongoDB में लगातार कनेक्शन या कनेक्शन पूलिंग