mongodb ক্ষেত্র / কী প্রতি স্বতন্ত্র মান সংখ্যা গণনা


110

একটি ক্ষেত্রের ডিবিতে কতগুলি স্বতন্ত্র মান রয়েছে তা গণনা করার জন্য কি কোনও প্রশ্ন রয়েছে?

fe আমার দেশের জন্য একটি ক্ষেত্র রয়েছে এবং এখানে 8 ধরণের দেশের মান রয়েছে (স্পেন, ইংল্যান্ড, ফ্রান্স, ইত্যাদি ...)

যদি কেউ নতুন দেশের সাথে আরও দস্তাবেজ যুক্ত করে তবে আমি কোয়েরিটি 9 তে ফিরে আসতে চাই।

গ্রুপিং এবং গণনা করার পরে কি আরও সহজ উপায় আছে?


4
আপনি কি সমষ্টি কাঠামোটি দেখেছেন ?
ওয়্যার্ডপ্রাইরি


উত্তর:


203

মঙ্গোডিবির একটি distinctকমান্ড রয়েছে যা ক্ষেত্রের জন্য স্বতন্ত্র মানগুলির অ্যারে প্রদান করে; আপনি একটি গণনার জন্য অ্যারের দৈর্ঘ্য পরীক্ষা করতে পারেন।

শেল db.collection.distinct()সহায়কও রয়েছে:

> db.countries.distinct('country');
[ "Spain", "England", "France", "Australia" ]

> db.countries.distinct('country').length
4

51
আপনার স্বতন্ত্র মানগুলির সংখ্যা খুব বেশি হলে এটি সত্যিই কার্যকর হয় না ... আপনি যদি বিশ্বের বিভিন্ন ব্যক্তির নাম বা কোনও কিছুর দিকে তাকান। আপনার কাছে এমন কোনও উত্তর আছে যা স্কেল করে?
আন্ডারআরনে গেছে

4
দৈর্ঘ্যের জন্য 1+। আমি এরকম কিছু খুঁজে পেতে লড়াই করছিলাম। ধন্যবাদ
আদিল আহমদ

আমি জানি না তারা কেন সেখানে গণনা () ব্যবহার করে না
মেরিয়ান ক্লিপস্পিজ

4
@ মারিয়ানক্ল্যাহস্পিজ - কারণ এটি কেবল একটি জাভাস্ক্রিপ্ট অ্যারে, যা উপাদানগুলির সংখ্যা গণনা করার জন্য দৈর্ঘ্যের সম্পত্তিটি ব্যবহার করে।
আপক্রিক

ঠিক আমি যা খুঁজছিলাম ... টিওয়াই
মৌলজে

117

একত্রিতকরণ API ব্যবহারের উদাহরণ এখানে। কেসটিকে জটিল করার জন্য আমরা নথির অ্যারে সম্পত্তি থেকে সংবেদনশীল শব্দ দ্বারা গ্রুপ করছি।

db.articles.aggregate([
    {
        $match: {
            keywords: { $not: {$size: 0} }
        }
    },
    { $unwind: "$keywords" },
    {
        $group: {
            _id: {$toLower: '$keywords'},
            count: { $sum: 1 }
        }
    },
    {
        $match: {
            count: { $gte: 2 }
        }
    },
    { $sort : { count : -1} },
    { $limit : 100 }
]);

যে যেমন ফলাফল দেয়

{ "_id" : "inflammation", "count" : 765 }
{ "_id" : "obesity", "count" : 641 }
{ "_id" : "epidemiology", "count" : 617 }
{ "_id" : "cancer", "count" : 604 }
{ "_id" : "breast cancer", "count" : 596 }
{ "_id" : "apoptosis", "count" : 570 }
{ "_id" : "children", "count" : 487 }
{ "_id" : "depression", "count" : 474 }
{ "_id" : "hiv", "count" : 468 }
{ "_id" : "prognosis", "count" : 428 }

4
এই উত্তরটি স্রেফ লগ ইন করেছেন। ধন্যবাদ! বিটিডব্লিউ যদি আপনি এটি একটি অনন্য ক্ষেত্রে করছেন, কেবল আনইন্ড লাইনের সরিয়ে দিন।
রিচি রিচ

@ রিচিরিচ, unwindপ্রয়োজনীয় কারণ কোডটি একটি অ্যারে ক্ষেত্রের পৃথক মানগুলিকে গোষ্ঠীভুক্ত করছে যা কীভাবে distinctকাজ করে তার সাথে মেলে ।
পল

@ পল রিচি যা বলেছেন তা হ'ল গ্রুপিংটি যদি কেবল "নিয়মিত" ক্ষেত্র (স্ট্রিং, ইন্ট ইত্যাদি) হয়ে থাকে তবে আপনার অযাচিত পদক্ষেপের প্রয়োজন হবে না। এটা ঠিক না?
লোকারাড

unwindঅ্যারে নিয়ে কাজ করার সময় @ গুয়ারাড প্রয়োজনীয়।
পল

উত্তরের জন্য +1, আমি ঠিক যে জিনিসটিতে কাজ করছিলাম, তার স্বতন্ত্র মনোনিবেশ রয়েছে তবে এটি কেবল সোনার :) - তথ্যের সাথে ফিল্টার করতে ফলাফলের পছন্দসই সেট অর্জন করতে আমাকে সমষ্টি সম্পর্কে আরও পড়তে হবে
তালহা

21

মঙ্গোডবি ৩.৪.৪ এবং আরও নতুন দিয়ে আপনি গণনা পাওয়ার জন্য $arrayToObjectঅপারেটর এবং একটি $replaceRootপাইপলাইন ব্যবহারের সুবিধা অর্জন করতে পারেন ।

উদাহরণস্বরূপ, ধরুন আপনার কাছে বিভিন্ন ভূমিকা সহ ব্যবহারকারীদের একটি সংগ্রহ রয়েছে এবং আপনি ভূমিকাগুলির স্বতন্ত্র গণনা গণনা করতে চাই। আপনাকে নিম্নলিখিত সামগ্রিক পাইপলাইন চালনা করতে হবে:

db.users.aggregate([
    { "$group": {
        "_id": { "$toLower": "$role" },
        "count": { "$sum": 1 }
    } },
    { "$group": {
        "_id": null,
        "counts": {
            "$push": { "k": "$_id", "v": "$count" }
        }
    } },
    { "$replaceRoot": {
        "newRoot": { "$arrayToObject": "$counts" }
    } }    
])

উদাহরণ আউটপুট

{
    "user" : 67,
    "superuser" : 5,
    "admin" : 4,
    "moderator" : 12
}

এটি প্রশ্নের উত্তর নয়, তবে এটি তবে সহায়ক। আমি ভাবছি কিভাবে এটি তুলনা করে .distinct()
রেডসান্দ্রো

9

আপনি মঙ্গো শেল এক্সটেনশানগুলিতে সুবিধা অর্জন করতে পারেন । এটি একটি একক .js আমদানি যা আপনি নিজের $HOME/.mongorc.jsবা প্রোগ্রামগতভাবে সংযুক্ত করতে পারেন যদি আপনিও Node.js / io.js এ কোড করে থাকেন।

নমুনা

ক্ষেত্রের প্রতিটি স্বতন্ত্র মানের জন্য ডকুমেন্টগুলিতে উপস্থিতি গণ্য করা হয় optionচ্ছিকভাবে ক্যোয়ারী দ্বারা ফিল্টার করা

> db.users.distinctAndCount('name', {name: /^a/i})

{
  "Abagail": 1,
  "Abbey": 3,
  "Abbie": 1,
  ...
}

ক্ষেত্রের প্যারামিটার ক্ষেত্রগুলির একটি অ্যারে হতে পারে

> db.users.distinctAndCount(['name','job'], {name: /^a/i})

{
  "Austin,Educator" : 1,
  "Aurelia,Educator" : 1,
  "Augustine,Carpenter" : 1,
  ...
}

আমি কীভাবে এটিকে নোডে আমদানি করব?
সালমান পি

require("./script.js"), আমি মনে করি
ইভানড্রিক্স

ঠিক আছে, কিন্তু আমি ভিতরে ফাংশন পেতে সক্ষম ছিল না। আমি তাদের কীভাবে ব্যবহার করব। এগুলি db.protoptype.distinctAndCount হিসাবে সংজ্ঞায়িত করা হয়েছে
সালমান পি

রেপোটির রেডমিমে একটি কীভাবে বিভাগ রয়েছে (আরটিএফএম! 1 !! 1!) মূলত, .mongorc.jsফাইলটি আপনার বাড়ির দিকে রাখুন। সম্পন্ন.
জ্যানিস এফ

7

field_1সংগ্রহের ক্ষেত্রে স্বতন্ত্র সন্ধান করতে তবে আমরা WHEREনীচের মতো করতে পারার চেয়ে কিছু শর্তও চাই:

db.your_collection_name.distinct('field_1', {WHERE condition here and it should return a document})

সুতরাং, namesসংগ্রহের থেকে পৃথক সংখ্যাটি সন্ধান করুন যেখানে বয়স> 25 এর মত হবে:

db.your_collection_name.distinct('names', {'age': {"$gt": 25}})

আশা করি এটা সাহায্য করবে!


0

আমি এই প্রশ্নটি ব্যবহার:

var collection = "countries"; var field = "country"; 
db[collection].distinct(field).forEach(function(value){print(field + ", " + value + ": " + db.hosts.count({[field]: value}))})

আউটপুট:

countries, England: 3536
countries, France: 238
countries, Australia: 1044
countries, Spain: 16

এই ক্যোয়ারীটি প্রথমে সমস্ত মানগুলিকে আলাদা করে এবং তারপরে প্রতিটিটির জন্য সংখ্যার সংখ্যা গণনা করে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.