मेरा सवाल है, इस तरह के कुछ दस्तावेज दिए गए हैं

{
  deliveryDay: "2021-01-14",
  plate: {
    name: "pasta",
    quantity: 1
  }
}

{
  deliveryDay: "2021-01-16",
  plate: {
    name: "pasta",
    quantity: 3
  }
}

{
  deliveryDay: "2021-01-16",
  plate: {
    name: "pizza",
    quantity: 2
  }
}


नीचे वांछित परिणाम प्राप्त करने का कोई तरीका है? मैंने $addFields जैसे {"$deliveryDay": "$plate.quantity" } के साथ एक कस्टम नामित फ़ील्ड रखने का प्रयास किया, लेकिन मुझे अमान्य त्रुटि देता है। एग्रीगेशन करना कोई समस्या नहीं है और मैं एग्रीगेशन-फ्रेमवर्क के अंदर हूं इसलिए मुझे एग्रीगेशन पाइपलाइन चरणों का उपयोग करके इसे करने की आवश्यकता है।

उपस्थित परिणाम:

{
  "2021-01-14": 1,
  "2021-01-16": 3,
  plate: {
    name: "pasta"
  }
}

{
  "2021-01-14": 0,
  "2021-01-16": 2,
  plate: {
    name: "pizza"
  }
}
2
Omar El Malak 29 मार्च 2021, 22:32

1 उत्तर

सबसे बढ़िया उत्तर

तो विचार है:

  1. plate.quantity का योग प्राप्त करने के लिए दस्तावेज़ों को deliveryDay और plate.name के आधार पर समूहित करें।
  2. [{ k: "", v: "" }] प्रारूप की एक सरणी उत्पन्न करने के लिए उपरोक्त परिणाम को फिर से name द्वारा समूहित करें।
  3. उपरोक्त सरणी में { k: "plate", v: { name: "$_id" } } को संयोजित करें।
  4. अब $arrayToObject का उपयोग करके array को ऑब्जेक्ट में बदलें .

मोंगो खेल के मैदान में समाधान। ये कोशिश करें:

db.testCollection.aggregate([
    {
        $group: {
            _id: {
                dDate: "$deliveryDay",
                name: "$plate.name"
            },
            sumOfQty: { $sum: "$plate.quantity" }
        }
    },
    {
        $group: {
            _id: "$_id.name",
            array: {
                $push: {
                    k: "$_id.dDate",
                    v: "$sumOfQty"
                }
            }
        }
    },
    {
        $addFields: {
            array: {
                $concatArrays: ["$array", [{ k: "plate", v: { name: "$_id" } }]]
            }
        }
    },
    {
        $replaceRoot: {
            newRoot: { $arrayToObject: "$array" }
        }
    }
]);

उत्पादन

/* 1 */
{
    "2021-01-16" : 2,
    "plate" : {
        "name" : "pizza"
    }
},

/* 2 */
{
    "2021-01-14" : 1,
    "2021-01-16" : 3,
    "plate" : {
        "name" : "pasta"
    }
}
3
Dheemanth Bhat 29 मार्च 2021, 23:52