سؤال

أحاول الحصول على قائمة بالقيم الفريدة من حقل "النوع" من مجموعة MongoDB الخاصة بي. مثال الوثائق أدناه:

{
       "_id" : ...,
       "type" : "report",
       "tasks" : ...
}
{
       "_id" : ...,
       "type" : "research",
       "tasks" : ...
}
{
       "_id" : ...,
       "type" : "memo",
       "tasks" : ...
}
{
       "_id" : ...,
       "type" : "memo",
       "tasks" : ...
}
{
       "_id" : ...,
       "type" : "report",
       "tasks" : ...
}
{
       "_id" : ...,
       "type" : "report",
       "tasks" : ...
}

أنا أبحث ، أمر بالتردد ، الأنواع الفريدة الموجودة في حقل النوع من المستندات ، لذلك:

["report", "memo", "research"]

ما هي الطريقة المثلى لعمل هذا؟ آمل أن أتمكن من القيام بذلك عن طريق الاستعلام مع Mongo وعدم تنزيل المجموعة بأكملها ...

هل كانت مفيدة؟

المحلول

على SQL DBMS قياسية ، سيتم ذلك مع الاستعلام التالي:

SELECT type, count(*) as ct FROM table GROUP BY type ORDER BY ct;

على MongoDB ، سيتم القيام بذلك باستخدام وظيفة المجموعة ، على الرغم من أنها أكثر تعقيدًا قليلاً:

db.collection.group(
           {key: { "type":true},
            reduce: function(obj,prev) { prev.count += 1; },
            initial: { count: 0 }
            });

أنا هنا أطلب من DB إرجاع قيم المفتاح "النوع" (وبالتالي "True") ، ولكل قيمة ، سيتم استخدام وظيفة تقليل المعطى لتجميع السجلات التي تم العثور عليها. أنا هنا فقط أقوم بتحديث عدد المرات التي يظهر فيها كل سجل. إذا قمت بتشغيل هذا الاستعلام ، فستحصل على شيء مثل هذا:

[
    {
        "type" : "report",
        "count" : 5
    },
    {
        "type" : "memo",
        "count" : 15
    }
    {
        "type" : "research",
        "count" : 3
    }

]

ستلاحظ أن هذا لم يتم طلبه ؛ حتى مستندات MongoDB تقول أن أسهل طريقة لطلب ذلك هي القيام بذلك من جانب العميل.

الوثائق ذات الصلة هي هنا.

نصائح أخرى

يمكنك استخدام متميز: http://www.mongodb.org/display/docs/aggregation#aggregation-distinct

هناك مثال في DOC PHP: http://php.net/manual/en/mongodb.command.php

$types = $db->command(array("distinct" => "yourCollection", "key" => "type"));

foreach ($types['values'] as $type) {
    echo "$type\n";
}

لا أعرف ما إذا كانت النتائج قد تم طلبها بالتردد.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top