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

विभिन्न क्षेत्रों द्वारा समूह कैसे करें

वह कठिन था!

सबसे पहले, नंगे समाधान:

db.test.aggregate([
 { "$match": { "user": "Hans" } },
 // duplicate each document: one for "age", the other for "childs"
 { $project: { age: "$age", childs: "$childs",
               data: {$literal: ["age", "childs"]}}},
 { $unwind: "$data" },
 // pivot data to something like { data: "age", value: "40" }
 { $project: { data: "$data",
               value: {$cond: [{$eq: ["$data", "age"]},
                               "$age", 
                               "$childs"]} }},
 // Group by data type, and count
 { $group: { _id: {data: "$data", value: "$value" }, 
             count: { $sum: 1 }, 
             value: {$first: "$value"} }},
 // aggregate values in an array for each independant (type,value) pair
 { $group: { _id: "$_id.data", values: { $push: { count: "$count", value: "$value" }} }} ,
 // project value to the correctly name field
 { $project: { result: {$cond: [{$eq: ["$_id", "age"]},
                               {age: "$values" }, 
                               {childs: "$values"}]} }},
 // group all data in the result array, and remove unneeded `_id` field 
 { $group: { _id: null, result: { $push: "$result" }}},
 { $project: { _id: 0, result: 1}}
])

उत्पादन:

{
    "result" : [
        {
            "age" : [
                {
                    "count" : 3,
                    "value" : "40"
                },
                {
                    "count" : 1,
                    "value" : "50"
                }
            ]
        },
        {
            "childs" : [
                {
                    "count" : 1,
                    "value" : "1"
                },
                {
                    "count" : 3,
                    "value" : "2"
                }
            ]
        }
    ]
}

और अब, कुछ स्पष्टीकरणों के लिए:

यहां प्रमुख मुद्दों में से एक यह है कि प्रत्येक आने वाले दस्तावेज़ को दो . का हिस्सा होना चाहिए अलग-अलग रकम। मैंने इसे एक शाब्दिक सरणी ["age", "childs"] . जोड़कर हल किया अपने दस्तावेज़ों के लिए, और फिर उन्हें उस सरणी से खोलना। इस तरह, प्रत्येक दस्तावेज़ दो बार प्रस्तुत किया जाएगा बाद के चरण में।

एक बार ऐसा करने के बाद, प्रसंस्करण को आसान बनाने के लिए, मैं डेटा प्रतिनिधित्व को कुछ अधिक प्रबंधनीय जैसे { data: "age", value: "40" } में बदल देता हूं।

निम्न चरण डेटा एकत्रीकरण प्रति-से निष्पादित करेंगे। तीसरे $project . तक वह चरण जो मान फ़ील्ड को संबंधित age . पर मैप करेगा या childs फ़ील्ड.

अंतिम दो चरण अनावश्यक _id . को हटाते हुए, दो दस्तावेज़ों को एक में लपेट देंगे फ़ील्ड.

पीएफएफ!




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. MongodDB $ सरणी से केवल एक तत्व खींचें

  2. MongoDB 3.6.3 में ReadConcernMajority को कैसे सक्षम करें?

  3. MongoDB ने mLab का अधिग्रहण किया – विभिन्न MongoDB होस्टिंग विकल्प क्या हैं?

  4. घटनाओं की गणना करें और एकत्रीकरण के दौरान स्ट्रिंग अक्षरशः डालें

  5. Mongoid में संबद्ध_से संबद्धता के साथ दस्तावेज़ एम्बेड करें