MongoDB Aggregate Pipeline-এ অ্যারে উপাদানের পার্থক্য ক্যালকুলেট করে সর্ট
যখন ডকুমেন্টে অ্যারে থাকে এবং সেখানে দুটি সংখ্যার পার্থক্য (সাবট্রাকশন) অনুযায়ী সর্ট করতে হয়, তবে $project-এ $let, $arrayElemAt, $subtract ব্যবহার করে পার্থক্য বের করে $sort দিতে হয়।
উদাহরণ: ডেটা ইনসার্ট
> db.demo155.insertOne({"Scores":[{"Value":45},{"Value":50}]});
{ "acknowledged" : true, "insertedId" : ObjectId("5e354584fdf09dd6d08539e3") }
> db.demo155.insertOne({"Scores":[{"Value":60},{"Value":10}]});
{ "acknowledged" : true, "insertedId" : ObjectId("5e35458efdf09dd6d08539e4") }
> db.demo155.insertOne({"Scores":[{"Value":100},{"Value":95}]});
{ "acknowledged" : true, "insertedId" : ObjectId("5e354599fdf09dd6d08539e5") }
সব ডকুমেন্ট দেখানো
> db.demo155.find();
আউটপুট:
{ "_id" : ObjectId("5e354584fdf09dd6d08539e3"), "Scores" : [ { "Value" : 45 }, { "Value" : 50 } ] }
{ "_id" : ObjectId("5e35458efdf09dd6d08539e4"), "Scores" : [ { "Value" : 60 }, { "Value" : 10 } ] }
{ "_id" : ObjectId("5e354599fdf09dd6d08539e5"), "Scores" : [ { "Value" : 100 }, { "Value" : 95 } ] }
অ্যাগ্রিগেশন পাইপলাইন: পার্থক্য বের করে ডিসেন্ডিং সর্ট
> db.demo155.aggregate([
... { "$match": { "Scores.1": { "$exists": true } } },
... { "$project": {
... "Scores": "$Scores",
... "sub": {
... "$let": {
... "vars": {
... "f": { "$arrayElemAt": [ "$Scores", -2 ] },
... "l": { "$arrayElemAt": [ "$Scores", -1 ] }
... },
... "in": { "$subtract": [ "$$l.Value", "$$f.Value" ] }
... }
... }
... }},
... { "$sort": { "sub": -1 } }
... ])
আউটপুট:
{ "_id" : ObjectId("5e354584fdf09dd6d08539e3"), "Scores" : [ { "Value" : 45 }, { "Value" : 50 } ], "sub" : 5 }
{ "_id" : ObjectId("5e354599fdf09dd6d08539e5"), "Scores" : [ { "Value" : 100 }, { "Value" : 95 } ], "sub" : -5 }
{ "_id" : ObjectId("5e35458efdf09dd6d08539e4"), "Scores" : [ { "Value" : 60 }, { "Value" : 10 } ], "sub" : -50 }
ব্যাখ্যা
$match— নিশ্চিত করে অ্যারেতে কমপক্ষে ২টি উপাদান আছে (Scores.1মানে ২য় উপাদান)۔$arrayElemAt: ["$Scores", -2]— শেষ থেকে ২য় উপাদান (এখানে প্রথমটি)۔$arrayElemAt: ["$Scores", -1]— শেষ উপাদান (২য়টি)۔$subtract: ["$$l.Value", "$$f.Value"]— শেষ মান থেকে প্রথম মান বিয়োগ।$sort: {sub: -1}— পার্থক্য বড় থেকে ছোট (ডিসেন্ডিং) সর্ট।
নোট: অ্যারে লেন্থ ফিক্সড না হলে $size চেক বা $reduce ব্যবহার করুন।