اذهب إلى المحتوى

السؤال

نشر

لدي مجموعة كبيرة من المستندات المتداخلة بحيث كل مستند يحوي بداخله عدّة مستندات أخرى nested. وأحاول الحصول على المستند الأكبر حجماً في هذه المجموعة. من التوثيق وجدت الدالة التالية:

db.collection.stats()

والتي تعطي متوسط الحجم، ولكن أرغب بالحصول على الحجم الأكبر ضمن هذه المجموعة وليس المتوسط. كيف يمكنني تحقيق ذلك؟

Recommended Posts

  • 0
نشر

يمكنك استخدام Object.bsonsize مع إجراء حلقة تكرارية على المستندات الموجودة ضمن هذه المجموعة بالشكل التالي:

let max_size = 0, doc_id = null;
db.test.find().forEach(doc => {
    const size = Object.bsonsize(doc); 
    if(size > max_size) {
        max = size;
        doc_id = doc._id;
    } 
});
print(doc_id, max_size);

وعندها سيتم طباعة الرقم المعرّف وأعلى حجم للمستند الأكبر الموجود ضمن المجموعة لديك.

ولكن ذلك بالتأكيد سيكون له تأثير على الأداء في حالة المجموعات التي تحوي أعداد كبيرة من المستندات لأنه سيتم المرور عليها جميعاً وإجراء شرط المقارنة.

كما يمكنك إنشاء مصفوفة وترتيبها ثم أخذ قيمة الحجم بالشكل المختصر التالي:

db.docs.find().toArray().map(function(doc) { return {size:Object.bsonsize(doc), _id:doc._id}; }).sort(function(a, b) { return a.size-b.size; }).pop();

والتي ستقوم بطباعة النتيجة التالية:

{ "size" : 3333, "_id" : "docId..." }

وبشكل مماثل يمكنك الحصول على الحجم من خلال خاصية التجميع aggregation والتي تعد الطريقة الأمثل للأداء في حال عدد المستندات الكبير:

db.docs.aggregate([
    { $match: {
        'docs.ids': { $exists: true }
    }},
    { $project: { 
        sizeLargestField: { $size: '$docs.ids' } 
    }},
    { $sort: {
        sizeLargestField: -1
    }},
])

والتي ستقوم بترتيب المستندات من الأكبر حجماً إلى الأصغر وبعدها يمكنك أخذ القيمة الأولى من الناتج.

  • 0
نشر

يمكنك استخدام ال $bsonSize ويعتبر aggregation operator  بداية من Mongo 4.4 سيقوم الكود التالي بإرجاع الحجم لكل مستند 

db.collection.aggregate([
  { $group: {
    _id: null,
    max: { $max: { $bsonSize: "$$ROOT" } }
  }}
])
  • ال max سيحمل الحجم لكل مستند

يمكنك قراءة المزيد من المعلومات عن ال  $bsonSize من هنا

  • -1
نشر

تجد الشيفرة التالية أكبر مستند في مجموعة.

var max = 0, id = null;
 
// الدوران حول المجموعة والتخقق من أحجام المستندات والمقارنة
db.store.find().forEach(doc => {
    var size = Object.bsonsize(doc);
    if(size > max) {
        max = size;
        id = doc._id;
    }
});
 

console.log(""+id+", "+max);

تجد الشيفرة التالية أكبر مستند عبر جميع المجموعات في قاعدة بيانات MongoDB. يقوم بطباعة اسم المجموعة ومعرف المستند وحجمه بالبايت كإخراج. بالنسبة لقواعد البيانات الكبيرة ، قد يستغرق ذلك دقائق أو حتى ساعات. 

var max = 0, id = null, c = null ;
 
// الدوران لايجاد المجموعة
db.getCollectionNames().forEach(function(cName) {
 
    //الدوران لايجاد المستندات في مجموعة 
    db[cName].find().forEach(doc => {
        var size = Object.bsonsize(doc);
        if(size > max) {
            max = size;
            id = doc._id;
            c = cName
        }
    });
});
 
console.log(c+", "+id+", "+max);

إذا كنت تستخدم MongoDB 4.4 أو إصدارًا أحدث ، فيمكنك ببساطة استخدام عامل التجميع الجديد $ bsonSize للعثور على حجم المستند. سيؤدي إلى تسريع كبير في العملية.

انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أجب على هذا السؤال...

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

  • إعلانات

  • تابعنا على



×
×
  • أضف...