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

नामांकित कुंजी के रूप में विशिष्ट उप दस्तावेज़ फ़ील्ड और आउटपुट की गणना करें

यहां मूल मामला .aggregate() $unwind के साथ क्योंकि आपको अपनी समूह कुंजी के रूप में सरणी में मानों तक पहुंच की आवश्यकता है और निश्चित रूप से $group क्योंकि इसी तरह आप चीजों को "ग्रुप" करते हैं:

db.collection.aggregate([
  { "$match": { "auctionId": 22 } },
  { "$unwind": "$itmLst" },
  { "$group": {
    "_id": "$itmLst.category",
    "count": { "$sum": 1 }
  }}
])

यह आपको आउटपुट देगा जैसे:

{ "_id": "ANTIQUES", "count": 56 }
{ "_id": "TOOLS", "count": 89 }
{ "_id": "JEWLRY", "count":  45 }

अब आपको वास्तव में इसके साथ रहना सीखना चाहिए, क्योंकि डिफ़ॉल्ट कर्सर प्रारूप में "सूची" एक अच्छी बात है जो स्वाभाविक रूप से चलने योग्य है। इसके अलावा IMHO नामित कुंजियाँ स्वाभाविक रूप से डेटा प्रस्तुति के लिए खुद को उधार नहीं देती हैं और आप आम तौर पर एक पुनरावृत्त सूची में एक सामान्य संपत्ति चाहते हैं।

यदि आप वास्तव में एकवचन नामित कुंजी आउटपुट का उपयोग करने के इरादे से हैं, तो आपको $arrayToObject जो आपको मानों को कुंजियों के नाम के रूप में उपयोग करने की अनुमति देगा, और निश्चित रूप से $replaceRoot उस एक्सप्रेशन आउटपुट को नए दस्तावेज़ के रूप में उपयोग करने के लिए:

db.collection.aggregate([
  { "$match": { "auctionId": 22 } },
  { "$unwind": "$itmLst" },
  { "$group": {
    "_id": "$itmLst.category",
    "count": { "$sum": 1 }
  }},
  { "$group": {
    "_id": null,
    "data": { "$push": { "k": "$_id", "v": "$count" } }
  }},
  { "$replaceRoot": {
    "newRoot": {
      "$arrayToObject": "$data"
    }
  }}
])

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

db.collection.aggregate([
  { "$match": { "auctionId": 22 } },
  { "$unwind": "$itmLst" },
  { "$group": {
    "_id": "$itmLst.category",
    "count": { "$sum": 1 }
  }}
]).toArray().reduce((acc,curr) => 
  Object.assign(acc,{ [curr._id]: curr.count }),
  {}
)

दोनों मूल एकत्रीकरण आउटपुट से नामित कुंजियों के साथ एक ही ऑब्जेक्ट में विलीन हो जाते हैं:

{
    "ANTIQUES": 56,
    "TOOLS": 89,
    "JEWLRY": 45,
    ...
}

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



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. मोंगो और अपरर्ट में अद्यतन सरणी

  2. मोंगोडीबी डॉकर छवि का उपयोग करके रोबोमोंगो को कनेक्ट नहीं कर सकता

  3. बहुत सारे डेटा लॉगिंग, डीबी या फ़ाइल के लिए आर्किटेक्चर?

  4. सी # से मोंगो डीबी में संग्रहीत जावास्क्रिप्ट को कैसे कॉल करें

  5. विदेशी संग्रह को देखें और छाँटें