سؤال

سأبدأ بالقول إنني قمت بالكثير من الأبحاث ولكني ما زلت ضائعًا جدًا.

لدي نسخة صالحة للعمل، لكنها بالتأكيد الطريقة الأقل فعالية للقيام بذلك.لست واثقًا تمامًا من معرفة أفضل طريقة لتخطيط قاعدة البيانات، فقد أصبحت أعتمد على ActiveRecord بوضوح.على أية حال، أنا ببساطة أحاول معرفة هذه الأشياء:

  1. تعرف على أفضل طريقة لتخطيط قاعدة البيانات (كيف يجب أن أقوم بفصل المستندات)
  2. العثور على الأكثر كفاءة للتعامل مع العلاقات
  3. ابحث عن طريقة جيدة للاستعلام من الخادم

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

بعض التعليمات البرمجية:

لذلك أنا أستخدم Node.js وCouchDB وnano كبرامج وسيطة.

وثيقة النشر:

{
"_id": "post-slug",
"title": "Post Slug",
"user": "film42",
"date": 1343451412,
"type": "post"
}

مستند المستخدم:

{
"_id": "film42",
"email": "test@example.com",
"posts": [
   "post-slug",
   "another-post-slug"
],
"type": "user"
}

وإليك كيفية جلب جميع المشاركات حاليًا (إنه أمر سيء حقًا!):

function buildUserPostArray(array, user, res, i) {
   db.get(user.posts[i], function(err, post_obj) {
       if(i < user.posts.length) {
           array.push(post_obj);
           buildUserPostArray(array, user, res, i+1);
       }
       else {
           console.log('Rendering view now.');
           res.render('user.jade', {
               user: user.user,
               posts: array
           });
       }
   });
}

app.get('/users/:id', function(req, res) {
    db.get(req.params.id, function(err, user_obj) {
       if(err) res.send('err1'); //bad id or server down

       array = [];
       buildUserPostArray(array, user_obj, res, 0);
    });
});

كنت أستخدم طرق العرض حتى أدركت أنني لا أستطيع تمرير متغير ثم بحثت في القوائم ولكني ضللت طريقي بعد قراءة العديد من البرامج التعليمية.

شكرا للمساعدة!!

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

المحلول

تريد حقا استخدام طريقة عرض.ما عليك سوى إنشاء طريقة العرض في المنشور مع المستخدم كمفتاح.

giveacodicetagpre.

ثم يمكنك ببساطة الاستعلام عن ذلك:

giveacodicetagpre.

سيعطيك جميع مستندات العرض المرتبطة بهذا المستخدم.

نصائح أخرى

كما قال ويل هارتونج، أنت تريد منظرًا ولكن يجب أن يبدو مختلفًا بعض الشيء عما أظهره ويل.

تأكد أولاً من وجود الحقول التي تريد إرسالها.لا تنسى null و 0 هي قيم خاطئة في JavaScript، لذا اعتمادًا على بنية البيانات الخاصة بك، قد يتعين عليك التحقق مما إذا كانت الحقول كذلك undefined صراحة.

إليك بعض التعليمات البرمجية لتوضح لك ما أعنيه.

function(doc) {
    if (doc.user && doc.title) { // This check is important
        emit(doc.user, {title: doc.title, date: doc.date});
    }
}

لا يتعين عليك إرسال معرف المستند بشكل صريح لأن ذلك يحدث تلقائيًا على أي حال.تأكد أيضًا من عدم إرسال مستندات كاملة emit(doc.user, doc);.وهذا غير فعال.في حال كنت بحاجة إلى المستند بأكمله، ما عليك سوى إرساله null كقيمة واستخدام include_docs=true معلمة URL.

لذلك في الأساس إذا كنت تنبعث منها null كقيمة فإنك ستحصل على المستند مثل هذا.

احصل على /yourdb/_design/app/_view/by_user?key=film42&include_docs=true

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