মোঙ্গোডিবি নির্বাচন করে গোষ্ঠী গোষ্ঠী


180

আমি মোঙ্গোডিবির সাথে প্রায় খেলছি যা একটি সাধারণ কীভাবে করা যায় তা বোঝার চেষ্টা করছি

SELECT province, COUNT(*) FROM contest GROUP BY province

তবে সামগ্রিক ফাংশনটি ব্যবহার করে আমি এটি বের করে আনতে পারি না। আমি কিছু সত্যই অদ্ভুত গ্রুপ বাক্য গঠন ব্যবহার করে এটি করতে পারি

db.user.group({
    "key": {
        "province": true
    },
    "initial": {
        "count": 0
    },
    "reduce": function(obj, prev) {
        if (true != null) if (true instanceof Array) prev.count += true.length;
        else prev.count++;
    }
});

তবে কি সামগ্রিক ফাংশনটি ব্যবহার করে আরও সহজ / দ্রুত উপায় আছে?

উত্তর:


326

এটি ব্যবহার করে এটি করার সহজ উপায় হবে aggregate:

db.contest.aggregate([
    {"$group" : {_id:"$province", count:{$sum:1}}}
])

1
আমি এটি চেষ্টা করার পরে আমি একটি ত্রুটি বার্তা পাই "errmsg" : "exception: A pipeline stage specification object must contain exactly one field.",?
স্টিভেন

আপনি কিভাবে এটি গোছানো না? আমি -১ দ্বারা গণনা বাছাই করতে চাই
ফিলিপ বার্টুজি

4
@ ফিলিপবার্টুজি ডকুমেন্টেশন পৃষ্ঠায় একটি উদাহরণ রয়েছে, আপনাকে পাইপলাইনে একটি ধরণের ক্রিয়াকলাপ যোগ করতে হবে, যেমন{ $sort: { count: -1 } }
ইলাইচ

আমি @ স্টিভেনের মতো একই ব্যতিক্রম পেয়েছি এবং এটি হ'ল কারণ আমি কেবল 2 লাইনটি কপি-পেস্ট করেছি এবং পার্শ্ববর্তী বর্গাকার বন্ধনীগুলি বাদ দিয়েছি।
পিটার পেরে

অনুগ্রহ যদি আপনি MongoDB সম্পর্কিত প্রশ্নের জন্য যা করতে পারেন হেল্প এবং - stackoverflow.com/questions/61067856/...
newdeveloper

66

সামগ্রিক ফাংশনের ফলাফলের ভিত্তিতে আমার কিছু অতিরিক্ত অপারেশন দরকার। অবশেষে আমি মোটোগোডিবি-র ফলাফলের ভিত্তিতে সামগ্রিক কার্যকারিতা এবং ক্রিয়াকলাপের জন্য কিছু সমাধান পেয়েছি। আমি Requestক্ষেত্র সহ একটি সংগ্রহ আছে request, source, status, requestDate

একক ক্ষেত্র গোষ্ঠী অনুসারে ও গণনা:

db.Request.aggregate([
    {"$group" : {_id:"$source", count:{$sum:1}}}
])

একাধিক ক্ষেত্র গোষ্ঠী অনুসারে ও গণনা:

db.Request.aggregate([
    {"$group" : {_id:{source:"$source",status:"$status"}, count:{$sum:1}}}
])

ক্ষেত্রটি ব্যবহার করে বাছাই করে একাধিক ক্ষেত্র গোষ্ঠী অনুসারে:

db.Request.aggregate([
    {"$group" : {_id:{source:"$source",status:"$status"}, count:{$sum:1}}},
    {$sort:{"_id.source":1}}
])

গণনা ব্যবহার করে বাছাই করে একাধিক ক্ষেত্র গোষ্ঠী অনুসারে ও গণনা করুন:

db.Request.aggregate([
    {"$group" : {_id:{source:"$source",status:"$status"}, count:{$sum:1}}},
    {$sort:{"count":-1}}
])

50

যদি আপনার দ্বারা একসাথে একাধিক কলামের প্রয়োজন হয় তবে এই মডেলটি অনুসরণ করুন। এখানে আমি একটি গণনা পরিচালনা করছি statusএবং type:

  db.BusinessProcess.aggregate({
    "$group": {
        _id: {
            status: "$status",
            type: "$type"
        },
        count: {
            $sum: 1
        }
    }
   })

2
_id একাধিক ক্ষেত্রের encapsুলেটের জন্য একটি ডিফল্ট পরম উপস্থাপন করে?
ইউজেন সানিক

18

অতিরিক্তভাবে যদি আপনাকে গ্রুপিং সীমাবদ্ধ করতে হয় তবে আপনি ব্যবহার করতে পারেন:

db.events.aggregate( 
    {$match: {province: "ON"}},
    {$group: {_id: "$date", number: {$sum: 1}}}  
)

17

মঙ্গোডিবি 3.4 থেকে শুরু করে, আপনি $sortByCountসমষ্টিটি ব্যবহার করতে পারেন ।

নির্দিষ্ট বর্ণের মানের উপর ভিত্তি করে আগত দলিলগুলিকে গোষ্ঠী দেয়, তারপরে প্রতিটি স্বতন্ত্র গ্রুপে নথিগুলির গণনা গণনা করে।

https://docs.mongodb.com/manual/reference/operator/aggregation/sortByCount/

উদাহরণ স্বরূপ:

db.contest.aggregate([
    { $sortByCount: "$province" }
]);

2
সম্ভবত এখানে লক্ষণীয় যে $sortByCountএটি আসলে একটি "সিউডো অপারেটর" যা মোংগোডিবি ৩.৪ থেকে আরও কয়েকটি সমষ্টিগত স্টেজ অপারেটরগুলির মতো চালু হয়েছিল। তারা সত্যিই যা করে তা তাদের নিজ নিজ একত্রিতকরণের পর্যায়ে প্রসারিত । এই ক্ষেত্রে একটি $groupসঙ্গে $sum: 1যেমন বিদ্যমান উত্তর এবং একটি অতিরিক্ত দেখানো $sort পর্যায়ে। তারা "কম কোড টাইপ করা" ছাড়া আর কোনও সুবিধা দেয় না, যা আরও বর্ণনামূলক হতে পারে বা নাও হতে পারে (যদি আপনি এই ধরণের জিনিসটিতে থাকেন)। আইএমএইচও, কোডের স্বতন্ত্র $groupএবং $sortপর্যায়গুলি অনেক বেশি বর্ণনামূলক এবং প্রকৃতপক্ষে আরও নমনীয়।
নিল লুন


0

মঙ্গো শেল কমান্ড যা আমার পক্ষে কাজ করেছে:

db.getCollection(<collection_name>).aggregate([{"$match": {'<key>': '<value to match>'}}, {"$group": {'_id': {'<group_by_attribute>': "$group_by_attribute"}}}])
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.