आप aggregation
. का उपयोग नहीं कर सकते किसी दस्तावेज़ को अपडेट करने के लिए, लेकिन आप उस डेटा को प्राप्त करने के लिए निश्चित रूप से इसका उपयोग कर सकते हैं जिसे आप अपडेट के लिए उपयोग करना चाहते हैं। सबसे पहले, मैंने देखा कि कुछ {}
हैं आपके grade
. के आसपास गुम है grade
के अंदर वस्तु सरणी। आप दोबारा जांचना चाहेंगे कि आपकी दस्तावेज़ संरचना पोस्ट की गई है। दूसरे, आपकी एकत्रीकरण क्वेरी में कुछ समस्याएं हैं।
- द
$avg
ऑपरेटर एक$group
. के अंदर काम करता है क्लॉज, न कि$project
। - जब आप
$avg
का उपयोग करते हैं , आपको$sum
. का उपयोग करने की आवश्यकता नहीं है । - आप औसत करना चाहते हैं
trucks.grades.grade.grade_number
, जो वास्तव में ग्रेड का अंकीय मान रखता है। यानी, आपgrade
. खो रहे हैंgrade
. के बीच औरgrade_number
।
यदि आप उन समस्याओं का समाधान करते हैं, तो आपको निम्न के जैसा एक प्रश्न प्राप्त होता है:
db.col.aggregate([
{ "$unwind": "$trucks" },
{ "$unwind": "$trucks.grades" },
{ "$group":
{
"_id": "$trucks.truck_id",
"average_grade": { "$avg": "$trucks.grades.grade_number" }
}
}
]);
आपके नमूना दस्तावेज़ के लिए, जो लौटाता है:
{ "_id" : "TEB5572", "average_grade" : 4 }
{ "_id" : "TEB7622", "average_grade" : 4 }
अब आप इस जानकारी का उपयोग average_grade
. को अपडेट करने के लिए कर सकते हैं खेत। यदि आप MongoDB संस्करण 2.6 या उच्चतर का उपयोग कर रहे हैं, तो aggregate
विधि एक कर्सर लौटाएगी। आप उस कर्सर के माध्यम से पुनरावृति कर सकते हैं और तदनुसार दस्तावेज़ों को अपडेट कर सकते हैं।
इस उदाहरण में, मैं उन दस्तावेज़ों की खोज करता हूं जिनमें एक विशेष truck_id
. है उनके trucks
. के अंदर सरणी और average_grade
को अपडेट करने के लिए आगे बढ़ें एकत्रीकरण क्वेरी द्वारा गणना की गई एक के साथ। आप अपनी आवश्यकताओं के अनुरूप इसे संशोधित कर सकते हैं। एग्रीगेशन क्वेरी के साथ, कोड इस तरह दिखता है।
// Get average grade for each truck and assign results to cursor.
var cur = db.col.aggregate([
{ "$unwind": "$trucks" },
{ "$unwind": "$trucks.grades" },
{ "$group":
{
"_id": "$trucks.truck_id",
"average_grade": { "$avg": "$trucks.grades.grade_number" }
}
}
]);
// Iterate through results and update average grade for each truck.
while (cur.hasNext()) {
var doc = cur.next();
db.col.update({ "trucks.truck_id": doc._id },
{ "$set": { "trucks.$.average_grade": doc.average_grade }},
{ "multi": true});
}