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

मोंगो / नेवला एकत्रीकरण - $redact और $cond मुद्दे

आप कोशिश कर सकते हैं $facet $addFields . के साथ समानांतर एकत्रीकरण के लिए 3.4 . में संस्करण।

यह समग्र जटिलता को कम करेगा और आप एक ही समय में अपने मिलान इनपुट के साथ समूह चला सकते हैं।

निम्न कोड अनुरोध वस्तु के आधार पर गतिशील रूप से एकत्रीकरण पाइपलाइन बनाता है।

// Sample request
var request = {
  "name":"RINGGO",
  "year": 2017,
  "month":3,
  "week":12
};

// Build initial match document on name

var match1 = {
  name: request["name"]
};

// Build project & facet document for date based aggregation

var addFields = {};
var facet = {};

// Add year followed by year facet

if (request["year"]) {
    addFields["year"] = { "$year": "$date" },
    facet["Yearly"] = 
      [
        {
          "$match":{ "year": request["year"] }
        },
        {
          "$group": {
            "_id": {
              "name": "$name",
              "year": "$year"
            },
            "spend": { "$push":"$amount" },
            "total": { "$sum": "$amount" }
        }
      }
    ];
}

// Add month followed by month facet

if (request["month"]) {
    addFields["month"] = { "$month": "$date" };
    facet["Monthly"] = 
      [
        {
          "$match":{ "month": request["month"] }
        },
        {
          "$group": {
            "_id": {
              "name": "$name",
              "month": "$month"
            },
            "spend": { "$push":"$amount" },
            "total": { "$sum": "$amount" }
         }
      }
    ];
}

// Add week followed by week facet

if (request["week"]) {
    addFields["week"] = { "$week": "$date" };
    facet["Weekly"] = 
      [
        {
          "$match":{ "week": request["week"] }
        },
        {
          "$group": {
            "_id": {
              "name": "$name",
              "week": "$week"
            },
            "spend": { "$push":"$amount" },
            "total": { "$sum": "$amount" }
         }
      }
    ];
}

// Use aggregate builder

statements.aggregate()
        .match(match1)
        .append({"$addFields": addFields}) // No addFields stage in mongoose builder
        .facet(facet)
        .exec(function(err, data) {});

name/year/month/week . के लिए मोंगो शैल क्वेरी मानदंड।

db.statements.aggregate({
    '$match': {
        name: 'RINGGO'
    }
}, {
    '$addFields': {
        year: {
            '$year': '$date'
        },
        month: {
            '$month': '$date'
        },
        week: {
            '$week': '$date'
        }
    }
}, {
    '$facet': {
        Yearly: [{
                '$match': {
                    year: 2017
                }
            },
            {
                '$group': {
                    _id: {
                        name: '$name',
                        year: '$year'
                    },
                    spend: {
                        '$push': '$amount'
                    },
                    total: {
                        '$sum': '$amount'
                    }
                }
            }
        ],
        Monthly: [{
                '$match': {
                    month: 3
                }
            },
            {
                '$group': {
                    _id: {
                        name: '$name',
                        month: '$month'
                    },
                    spend: {
                        '$push': '$amount'
                    },
                    total: {
                        '$sum': '$amount'
                    }
                }
            }
        ],
        Weekly: [{
                '$match': {
                    week: 12
                }
            },
            {
                '$group': {
                    _id: {
                        name: '$name',
                        week: '$week'
                    },
                    spend: {
                        '$push': '$amount'
                    },
                    total: {
                        '$sum': '$amount'
                    }
                }
            }
        ]
    }
})

नमूना प्रतिक्रिया

    {
    "Yearly": [{
        "_id": {
            "name": "RINGGO",
            "year": 2017
        },
        "spend": [-3.3, -6.3, -3.3, -6.3, -3.3, -3.3],
        "total": -25.799999999999997
    }],
    "Monthly": [{
        "_id": {
            "name": "RINGGO",
            "month": 3
        },
        "spend": [-3.3, -6.3, -3.3, -6.3, -3.3, -3.3],
        "total": -25.799999999999997
    }],
    "Weekly": [{
        "_id": {
            "name": "RINGGO",
            "week": 12
        },
        "spend": [-6.3, -3.3],
        "total": -9.6
    }]
}

आप Year/Month . के लिए समान एकत्रीकरण चला सकते हैं और Year इनपुट मान।

यह $group . में होता है 1 जहां $week एकत्रीकरण दो तिथियों में से प्रत्येक [15, 16] राशि को सप्ताह 11 में और अन्य दो तिथियों [22, 23] राशि को सप्ताह 12 बाद में जोड़ देता है ताकि MonthySpends में योग के योग के रूप में दिखाया जा सके। ।




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. जेएसओएन ईजेएस से जेएसओएन ऑब्जेक्ट में जेएस

  2. मोंगोस में स्लेवओके कैसे चलाएं?

  3. नेस्टेड वस्तु संपत्ति पर MongoDB $ne का उपयोग कैसे करें?

  4. डेटाबेस बैकअप के लिए सर्वोत्तम अभ्यास

  5. MongoDB {एकत्रीकरण $ मैच} बनाम {ढूंढें} गति