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

MongoDB संग्रह में दिए गए मानदंडों से मेल खाने वाले दस्तावेज़ और एकल उप-दस्तावेज़ कैसे खोजें

आप जो खोज रहे हैं वह है स्थितिगत $ ऑपरेटर और "प्रक्षेपण"। एकल फ़ील्ड के लिए आपको "डॉट नोटेशन" का उपयोग करके आवश्यक सरणी तत्व से मिलान करने की आवश्यकता है, एक से अधिक फ़ील्ड उपयोग के लिए $elemMatch :

db.products.find(
    { "items.date": "31.08.2014" },
    { "shop": 1, "name":1, "items.$": 1 }
)

या $elemMatch एक से अधिक मेल खाने वाले फ़ील्ड के लिए:

db.products.find(
    { "items":  { 
        "$elemMatch": { "date": "31.08.2014",  "purchasePrice": 1 }
    }},
    { "shop": 1, "name":1, "items.$": 1 }
)

ये केवल एक सरणी तत्व के लिए काम करते हैं और केवल एक ही लौटाया जाएगा। यदि आप चाहते हैं कि आपकी शर्तों से एक से अधिक सरणी तत्व लौटाए जाएं तो आपको एकत्रीकरण ढांचे के साथ अधिक उन्नत प्रबंधन की आवश्यकता होगी।

db.products.aggregate([
    { "$match": { "items.date": "31.08.2014" } },
    { "$unwind": "$items" },
    { "$match": { "items.date": "31.08.2014" } },
    { "$group": {
        "_id": "$_id",
        "shop": { "$first": "$shop" },
        "name": { "$first": "$name" },
        "items": { "$push": "$items" }
    }}
])

या संभवतः मोंगोडीबी 2.6 के बाद से छोटे/तेज रूप में जहां आपके आइटम की सरणी में अद्वितीय प्रविष्टियां हैं:

db.products.aggregate([
    { "$match": { "items.date": "31.08.2014" } },
    { "$project": {
        "shop": 1,
        "name": 1,
        "items": {
            "$setDifference": [
                { "$map": {
                    "input": "$items",
                    "as": "el",
                    "in": {
                        "$cond": [
                            { "$eq": [ "$$el.date", "31.08.2014" ] },
                            "$$el",
                            false 
                        ]
                    }
                }},
                [false]
            ]
        }
    }}
])

या संभवतः $redact के साथ , लेकिन थोड़ा सा काल्पनिक:

db.products.aggregate([
    { "$match": { "items.date": "31.08.2014" } },
    { "$redact": {
        "$cond": [
             { "$eq": [ { "$ifNull": [ "$date", "31.08.2014" ] }, "31.08.2014" ] },
             "$$DESCEND",
             "$$PRUNE"
         ]
    }}
])

अधिक आधुनिक, आप $filter . का उपयोग करेंगे :

db.products.aggregate([
  { "$match": { "items.date": "31.08.2014" } },
  { "$addFields": {
    "items": {
      "input": "$items",
      "cond": { "$eq": [ "$$this.date", "31.08.2014" ] }
    }
  }}
])

और कई शर्तों के साथ, $elemMatch और $and $filter . के भीतर :

db.products.aggregate([
  { "$match": { 
    "$elemMatch": { "date": "31.08.2014",  "purchasePrice": 1 }
  }},
  { "$addFields": {
    "items": {
      "input": "$items",
      "cond": { 
        "$and": [
          { "$eq": [ "$$this.date", "31.08.2014" ] },
          { "$eq": [ "$$this.purchasePrice", 1 ] }
        ]
      }
    }
  }}
])

तो यह सिर्फ इस बात पर निर्भर करता है कि क्या आप हमेशा एक ही तत्व से मेल खाने की उम्मीद करते हैं या कई तत्वों से, और फिर कौन सा दृष्टिकोण बेहतर है। लेकिन जहां संभव हो .find() विधि आम तौर पर तेज़ होगी क्योंकि इसमें अन्य परिचालनों के ऊपरी हिस्से की कमी होती है, जो कि अंतिम रूपों में बिल्कुल पीछे नहीं रहते हैं।

एक साइड नोट के रूप में, आपकी "तारीखों" को तार के रूप में दर्शाया जाता है जो आगे बढ़ने का एक बहुत अच्छा विचार नहीं है। इन्हें उचित दिनांक में बदलने पर विचार करें ऑब्जेक्ट प्रकार, जो भविष्य में आपकी बहुत मदद करेंगे।



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. MongoDB सबफील्ड की सूची प्रक्षेपण

  2. 2dsphere अनुक्रमित फ़ील्ड पर नेवला के पास (...) क्वेरी मान्य परिणाम नहीं लौटा रही है

  3. Mongo C# 2.0 ड्राइवर का उपयोग करके एंबेडेड दस्तावेज़ को बदलें

  4. इंसर्टमैनी मोंगोडब में काम नहीं कर रहा है

  5. अब उपलब्ध:AWS पर पूरी तरह से होस्ट किए गए MongoDB इंस्टेंस