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

$group by . के बाद डायनामिक कुंजियाँ

ऐसा नहीं है कि मुझे लगता है कि यह एक अच्छा विचार है और अधिकतर क्योंकि मुझे यहां कोई "एकत्रीकरण" नहीं दिख रहा है, यह है कि "समूहीकरण" के बाद एक सरणी में जोड़ने के लिए आप इसी तरह $push "status" . द्वारा उस सभी सामग्री को सरणी में समूहीकरण कुंजी और फिर $replaceRoot . में दस्तावेज़ की कुंजियों में कनवर्ट करें $arrayToObject . के साथ :

db.collection.aggregate([
  { "$group": {
    "_id": "$status",
    "data": { "$push": "$$ROOT" }
  }},
  { "$group": {
    "_id": null,
    "data": {
      "$push": {
        "k": "$_id",
        "v": "$data"
      }
    }
  }},
  { "$replaceRoot": {
    "newRoot": { "$arrayToObject": "$data" }
  }}
])

रिटर्न:

{
        "inProgress" : [
                {
                        "_id" : ObjectId("5b18d31a27a37696ec8b5776"),
                        "status" : "inProgress",
                        "description" : "inProgress..."
                }
        ],
        "completed" : [
                {
                        "_id" : ObjectId("5b18d31a27a37696ec8b5773"),
                        "status" : "completed",
                        "description" : "completed..."
                }
        ],
        "pending" : [
                {
                        "_id" : ObjectId("5b18d14cbc83fd271b6a157c"),
                        "status" : "pending",
                        "description" : "You have to complete the challenge..."
                },
                {
                        "_id" : ObjectId("5b18d31a27a37696ec8b5775"),
                        "status" : "pending",
                        "description" : "pending..."
                }
        ]
}

यह ठीक हो सकता है IF आप वास्तव में पहले से "एकत्रित" हैं, लेकिन किसी भी व्यावहारिक रूप से आकार के संग्रह पर जो कुछ भी कर रहा है वह पूरे संग्रह को एक दस्तावेज़ में मजबूर करने की कोशिश कर रहा है, और यह 16 एमबी की बीएसओएन सीमा को तोड़ने की संभावना है, इसलिए मैं इसके बिना भी प्रयास करने की अनुशंसा नहीं करता " ग्रुपिंग" इस चरण से पहले कुछ और।

सच कहूं, तो वही निम्नलिखित कोड वही काम करता है, और बिना एकत्रीकरण के ट्रिक्स और बिना बीएसओएन सीमा की समस्या के:

var obj = {};

// Using forEach as a premise for representing "any" cursor iteration form
db.collection.find().forEach(d => {
  if (!obj.hasOwnProperty(d.status))
    obj[d.status] = [];
  obj[d.status].push(d);
})

printjson(obj);

या थोड़ा छोटा:

var obj = {};

// Using forEach as a premise for representing "any" cursor iteration form
db.collection.find().forEach(d => 
  obj[d.status] = [ 
    ...(obj.hasOwnProperty(d.status)) ? obj[d.status] : [],
    d
  ]
)

printjson(obj);

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




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. साझा समूहों के लिए MongoDB बैकअप प्रबंधन युक्तियाँ

  2. कई क्षेत्रों पर Node.js और नेवला रेगेक्स क्वेरी

  3. MongoDB - डेटा आयात करें

  4. मोंगोडब में स्थानीय समय क्षेत्र में एकत्रीकरण

  5. कस्टम फ़ंक्शन परिकलित कॉलम मोंगोडब प्रोजेक्शन