MongoDB PHP الحصول على قيم فريدة
-
28-09-2019 - |
سؤال
أحاول الحصول على قائمة بالقيم الفريدة من حقل "النوع" من مجموعة 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";
}
لا أعرف ما إذا كانت النتائج قد تم طلبها بالتردد.