mongodb क्षेत्र / कुंजी के अनुसार अलग-अलग मानों की संख्या गिनता है


104

क्या किसी फ़ील्ड में DB में कितने अलग-अलग मान हैं, इसकी गणना करने के लिए एक क्वेरी है।

fe मेरे पास देश के लिए एक क्षेत्र है और देश के 8 प्रकार के मूल्य हैं (स्पेन, इंग्लैंड, फ्रांस, आदि ...)

यदि कोई नए देश के साथ अधिक दस्तावेज जोड़ता है तो मैं 9 को वापस करने के लिए क्वेरी चाहूंगा।

वहाँ तो समूह और गिनती आसान तरीका है?


2
क्या आपने एकत्रीकरण ढांचे को देखा है ?
वायर्डपाइरी


एक अनुक्रमित कॉलम पर MongoDB चयन की संभावित डुप्लिकेट (अलग x) - बड़े डेटा सेट के लिए अद्वितीय परिणाम गिनें । मैंने अपना जवाब वहीं पोस्ट कर दिया।
विशेषज्ञ

जवाबों:


198

MongoDB में एक distinctकमांड है जो एक क्षेत्र के लिए अलग-अलग मानों की एक सरणी लौटाता है; आप एक गिनती के लिए सरणी की लंबाई की जांच कर सकते हैं।

एक शेल db.collection.distinct()सहायक भी है:

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

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

47
यह वास्तव में काम नहीं करता है यदि आपके अलग-अलग मूल्यों की संख्या बहुत अधिक है ... यदि आप दुनिया में लोगों के अलग-अलग नामों या कुछ को देख रहे थे। क्या आपके पास एक उत्तर है जो तराजू है?
underrun

3
लंबाई के लिए 1+। मैं ऐसा कुछ खोजने के लिए संघर्ष कर रहा था। धन्यवाद।
अदील अहमद

मुझे पता नहीं है कि वे गिनती का उपयोग क्यों नहीं करते () साथ ही
मैरिएन क्लूपीज

1
@ MarianKlühspies - क्योंकि यह सिर्फ एक जावास्क्रिप्ट सरणी है, जो तत्वों की संख्या की गणना करने के लिए लंबाई संपत्ति का उपयोग करता है।
UpTheCreek

बस मैं क्या देख रहा था ... TY
मौलज़े

113

यहाँ एकत्रीकरण एपीआई का उपयोग करने का उदाहरण है। दस्तावेज़ की सरणी संपत्ति से केस-असंवेदनशील शब्दों द्वारा समूहित किए जाने वाले मामले को जटिल बनाने के लिए।

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 }

2
बस इस उत्तर के लिए लॉग इन करें। धन्यवाद! btw अगर आप इसे एक अनूठे क्षेत्र पर कर रहे हैं, तो सिमित रेखा को हटा दें।
रिची रिच

@RichieRich, unwindआवश्यक है क्योंकि कोड एक सरणी फ़ील्ड के व्यक्तिगत मानों को समूहित कर रहा है जो कि कैसे distinctकाम करता है।
पॉल

@Paul ने कहा कि रिची ने कहा है कि यदि समूहन केवल "नियमित" फ़ील्ड (स्ट्रिंग, इंट आदि) से किया जाता है, तो आपको खोलना आवश्यक नहीं है। क्या यह सही नहीं है?
मसराद

unwindसरणियों के साथ काम करते समय @guyarad आवश्यक है।
पॉल

जवाब के लिए +1, बिल्कुल जिस चीज़ पर मैं काम कर रहा था, उसके अलग-अलग आकर्षण हैं, लेकिन यह सिर्फ सोना है :) - किसी भी तरह मुझे डेटा फ़िल्टर करने के लिए परिणामों के वांछित सेट को प्राप्त करने के लिए समुच्चय के बारे में अधिक पढ़ना होगा
ताल्हा

21

MongoDb 3.4.4 और नए के साथ, आप काउंटर्स प्राप्त करने के लिए $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()
Redsandro

9

आप मानगो शैल एक्सटेंशन पर लाभ उठा सकते हैं । $HOME/.mongorc.jsयदि आप Node.js / io.js में भी कोडिंग कर रहे हैं, तो यह एक .js आयात है जिसे आप अपने लिए , या प्रोग्रामेटिक रूप से जोड़ सकते हैं।

नमूना

फ़ील्ड के प्रत्येक अलग-अलग मान के लिए क्वेरी द्वारा वैकल्पिक रूप से फ़िल्टर किए गए दस्तावेज़ों में होने वाली घटनाओं को गिना जाता है

> 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"), मुझे लगता है
१rix

सही है, लेकिन मैं कार्यों को अंदर लाने में सक्षम नहीं था। उन्हें इस्तेमाल कैसे करूं। उन्हें db.protoptype.distinctAndCount
Salmaan P

मूल रूप से रेपो के रीडमी (RTFM! 1 !! 1!) में कैसे-कैसे सेक्शन है, .mongorc.jsफाइल को अपने घर के वारिस में रखें। किया हुआ।
जैनिस एफ

6

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}})

आशा करता हूँ की ये काम करेगा!

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.