2014-08-30 4 views
11

में दिए गए मानदंडों के दस्तावेज़ और एकल उप-दस्तावेज़ मिलान को कैसे ढूंढें मेरे पास उत्पादों का संग्रह है। प्रत्येक उत्पाद में वस्तुओं की सरणी होती है।मोंगोडीबी संग्रह

> db.products.find().pretty() 
{ 
    "_id" : ObjectId("54023e8bcef998273f36041d"), 
    "shop" : "shop1", 
    "name" : "product1", 
    "items" : [ 
      { 
        "date" : "01.02.2100", 
        "purchasePrice" : 1, 
        "sellingPrice" : 10, 
        "count" : 15 
      }, 
      { 
        "date" : "31.08.2014", 
        "purchasePrice" : 10, 
        "sellingPrice" : 1, 
        "count" : 5 
      } 
    ] 
} 

तो, आप मुझे एक सलाह दे सकते हैं, कैसे मैं केवल एक आइटम जो तारीख तारीख मैं पैरामीटर के रूप में क्वेरी करने के लिए पारित करने के लिए बराबर होती है के साथ सभी उत्पादों को पुनः प्राप्त करने MongoDB क्वेरी कर सकते हैं।

"2014/08/31" के लिए परिणाम होना चाहिए:

{ 
    "_id" : ObjectId("54023e8bcef998273f36041d"), 
    "shop" : "shop1", 
    "name" : "product1", 
    "items" : [ 
      { 
        "date" : "31.08.2014", 
        "purchasePrice" : 10, 
        "sellingPrice" : 1, 
        "count" : 5 
      } 
    ] 
} 
+0

3.2 से शुरू होने वाले '$ फ़िल्टर' का उपयोग करें। यहां और अधिक https://stackoverflow.com/questions/3985214/retrieve-only-the-queried-element-in-an-object-array-in-mongodb-collection – Veeram

उत्तर

26

क्या आप देख रहे हैं the positional $ ऑपरेटर और "प्रक्षेपण" है।

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 } 
) 

एक भी क्षेत्र के लिए आप एक से अधिक क्षेत्र का उपयोग करें $elemMatch के लिए "डॉट नोटेशन" का उपयोग आवश्यक सरणी तत्व मिलान करने के लिए, की जरूरत है ये केवल एक सरणी तत्व के लिए काम करते हैं और केवल एक ही लौटा दिया जाएगा। यदि आप अपनी स्थितियों से एक से अधिक सरणी तत्व वापस लौटना चाहते हैं तो आपको समेकन ढांचे के साथ अधिक उन्नत हैंडलिंग की आवश्यकता है।

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" } 
    }} 
]) 

या संभवतः MongoDB 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" 
     ] 
    }} 
]) 

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

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

+0

धन्यवाद! बहुत बढ़िया जवाब! यह निश्चित रूप से मैं क्या देख रहा था और भी अधिक। – evgeniy44

+0

धन्यवाद। आपने इसे विस्तार से समझाया है –

0

मोंगो उप-प्रश्नों के लिए डॉट नोटेशन का समर्थन करता है।

देखें:

db.products.find({"items.date":"31.08.2014"}); 

ध्यान दें कि विशेषता, डॉट नोटेशन के लिए उद्धरण में है, भले ही आम तौर पर अपने ड्राइवर इस की आवश्यकता नहीं है: http://docs.mongodb.org/manual/reference/glossary/#term-dot-notation

अपने ड्राइवर के आधार पर आप की तरह कुछ करना चाहते हैं।

संबंधित मुद्दे