سؤال

لديّ مجموعة mongodb تحتوي على مستندات مثل تلك أدناه:

[
  {
  :event => {:type => 'comment_created'}, 
  :item  => {:id => 10},
  :created_at => {:t => '11:19:03 +0100 2010', :d=> 'Fri, 19 Nov 2010'}
  }

,
  {
  :event => {:type => 'vote_created'}, 
  :item  => {:id => 10},
  :created_at => {:t => '11:19:03 +0100 2010', :d => 'Fri, 19 Nov 2010'}
  }
]

ما أحتاجه هو إنشاء أحدث نشاط تجميع "لوحة القيادة" (في اليوم الحالي) لكل عنصر. يجب أن تكون النتيجة شيئًا مثل:

{
:item_id => 10,
:events => {
  :vote_created => [.. ordered list with latest 3 vote_created events/documents],
  :comment_created => [.. ordered list with latest 3 comment_created events/documents ],
  }
}

سيتم استخدام النتيجة لبناء بناء جملة "على غرار Facebook" مثل: "Mike و John و 3 آخرون آخرون تعليقات على العنصر الخاص بك اليوم."

كيف يمكنني تجميع هذه البيانات باستخدام مجموعة أو وظيفة خريطة؟

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

المحلول

حسنًا ، هناك طريقتان للقيام بذلك:

الطريقة رقم 1: Reduce MAP

أولاً ، ستحتاج إلى تشغيل خريطة-وليس مجموعة.

استخدم Reduce Map مع متغير "Out" الذي سيولد مجموعة جديدة. ستتمكن بعد ذلك من تشغيل الاستعلامات الموجزة مقابل تلك المجموعة الجديدة.

السبب في أنك ستفعل ذلك هو أنك تطلب استعلامًا باهظًا ، لذلك من المعقول أكثر بكثير في الوقت الفعلي "غير الأساسي".

الطريقة رقم 2: الكتاب المزدوج

يمكنك في الأساس الحفاظ على مجموعتين "تفاصيل" (أعلى واحد) و "ملخص" (أسفل واحد). كلما قمت بكتابة إلى التفاصيل ، قم أيضًا بإجراء تحديث إلى الملخص.

MongoDB لديه العديد من أساليب الصفيف ($ push ، $ سحب ، شريحة $) ، من الممكن أن يجعل من الممكن الحفاظ على صفيف "VOUT_CREATED".

التفضيلات

تعتمد الطريقة التي تحددها بالكامل على نوع الهندسة المعمارية التي لديك وتجربة المستخدم التي تريدها. شخصياً ، أود فقط استخدام الطريقة رقم 2 وأواصل إلحاقها بمجموعة "POTT_CREATED". أود أن أضع بناء جملة "Mike و John و 3 آخرين ..." في مكان ما على العرض ، B/C إنه حقًا عرض منطق وليس منطق DB.

نعم ، تأخذ الطريقة رقم 2 مساحة أكبر ، ولكنها تمنحك أيضًا إجابات سريعة على الأسئلة التي تطرحها كثيرًا. لذلك سيكون عليك التضحية بالمساحة للحصول على هذه السرعة.

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