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

क्या मोंगोडीबी के एकत्रीकरण ढांचे के साथ एकाधिक कॉलम समूह और योग करना संभव है?

MongoDB 3.4 के बाद से इसे $facet के साथ कई एकत्रीकरण पाइपलाइनों का उपयोग करके थोड़ा आसान किया जा सकता है ।

दस्तावेज़ों से लिया गया :

तो, आपके उपयोग के मामले में, यह निम्नलिखित द्वारा प्राप्त किया जाएगा:

const aggregatorOpts = [
    { $match: { character: 'broquaint' } }, // Match the character
    {
        // Seperate into 2 or more pipes that will count class and
        // race seperatly
        $facet: {
            race: [
                // Group by race and get the count:
                // [
                //   {
                //     _id: 'Halfling',
                //     count: 3
                //   }
                //   {
                //     _id: 'Naga',
                //     count: 2
                //   }
                // ]

                // $sortByCount is the same as
                // { $group: { _id: <expression>, count: { $sum: 1 } } },
                // { $sort: { count: -1 } }

                { $sortByCount: '$race' },

                // Now we want to transform the array in to 1 document,
                // where the '_id' field is the key, and the 'count' is the value.
                // To achieve this we will use $arrayToObject. According the the
                // docs, we have to first rename the fields to 'k' for the key,
                // and 'v' for the value. We use $project for this:
                {
                    $project: {
                        _id: 0,
                        k: '$_id',
                        v: '$count',
                    },
                },
            ],
            // Same as above but for class instead
            class: [
                { $sortByCount: '$class' },
                {
                    $project: {
                        _id: 0,
                        k: '$_id',
                        v: '$count',
                    },
                },
            ],
        },
    },
    {
        // Now apply the $arrayToObject for both class and race.
        $addFields: {
            // Will override the existing class and race arrays
            // with their respective object representation instead.
            class: { $arrayToObject: '$class' },
            race: { $arrayToObject: '$race' },
        },
    },
];

db.races.aggregate(aggregatorOpts)

जो निम्नलिखित उत्पन्न करता है:

[
  {
    "race": {
      "Halfling": 3,
      "Naga": 2
    },
    "class": {
      "Hunter": 3,
      "Rogue": 1,
      "Fighter": 1,
    }
  }
]

यदि आप @Asya प्रदान किए गए आउटपुट स्वरूपण से खुश हैं, तो आप $project . को हटा सकते हैं और $addFields चरण, और बस $sortByCount . छोड़ दें प्रत्येक उप-पाइपलाइन में भाग लें।

इन नई सुविधाओं के साथ, अतिरिक्त गणनाओं के साथ एकत्रीकरण का विस्तार करना बहुत आसान है,बस $facet में एक और एकत्रीकरण पाइपलाइन जोड़ें .उप समूहों को गिनना थोड़ा आसान है, लेकिन यह एक अलग प्रश्न होगा।



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. जावा में बीएसओएन से जेएसओएन दस्तावेज़ रूपांतरण

  2. क्या मुझे नेवला में एक-एक करके सरणी या डेटा वापस करना चाहिए

  3. php . के साथ अपरर्ट के बाद mongodb _id ऑब्जेक्ट प्राप्त करें

  4. बीएसओएन स्ट्रिंग (सीस्ट्रिंग/एनाम नहीं) के बाद पिछला 0x00 बाइट क्यों?

  5. मैं mongoDB में डबल सरणी कैसे फ़्लैट कर सकता हूं?