سعید
1 سال پیش توسط سعید مطرح شد
8 پاسخ

فیلتر بر اساس دسته بندی

export const getNewsAbiek = async (req , res) => {
  try {
     const news = await News.findAll({
       limit: 4,
       order: ['catId' , 'DESC'],
       $sort: {catId:1},
       include: [{
         model: Users,
         attributes: ['id' , 'name' , 'email' , 'url']
       }]
     })
    res.json(news)
  } catch (error) {
    console.log(error);
  }
}

سلام دوستان من این کد رو نوشتم .میخوام اخبار بر اساس اسم فقط یکی از دسته بندی هام نمایش داده بشه
الان در حال حاضر اخبار من بر اساس تمام دسته بندی ها نمایش داده میشه و نمیتونم بر اساس یک دسته بندی کنم


ثبت پرسش جدید
محمد رضا
تخصص : Full Stack Developer
@salar.mohammad2013 1 سال پیش مطرح شد
0

سلام دوست عزیز لطفا اول پرسشت رو ویرایش کن و کدت رو توی تگ کد قرار بده مثل زیر تا بتونیم کدت رو ببینیم

let test='hello';

مورد دوم یک نمونه داده ی خودت یا جدولت رو لاگ بگیر و ببینیم چیا هستن که بتونیم دسته بندی کنیم
الان ما نمیدونیم اخباری که میگی چه دسته بندی هایی داره
این دسته بندی از کجا مشخص میشه که کدومه و کجای خبر نشونده شده که بتونیم نظری بدیم
لطفا داده ی بیشتری به اشتراک بزار و کامل توضیح بده با نمونه فیلد یا یک لاگ خروجی داده ای


محمد رضا
تخصص : Full Stack Developer
@salar.mohammad2013 1 سال پیش مطرح شد
0

@رحیم زاده
سلام مجدد
ببین شما قطعا توی news خودت یک فیلد به اسم category داری
توی زبان های برنامه نویسی وقتی به دیتابیس کوئری میزنیم یه چیزی داریم به اسم groupBy که خیلی راحت خودش میاد و دسته بندی میکنه
توی نود من سر رشته ندارم اما این یه جاوا اسکریپت سادست پس میتونی خیلی راحت با یه حلقه بیایی و خودت داده هات رو دسته بندی کنی
من یه راه حل خوب براش پیدا کردم و اونم به شکل زیر هست

const groupByCategory = products.reduce((group, product) => {
  const { category } = product;
  group[category] = group[category] ?? [];
  group[category].push(product);
  return group;
}, {});

console.log(groupByCategory);

کد رو توضیحش بدم اگر شما یا دوست دیگری همین سوال رو داشت متوجهش بشه
تابع reduce از توابع خود جاوا اسکریت هست و مثل map میاد کل یک ارایه رو پیمایش میکنه اما با یک تفاوت و اون هم اینه که یک مقداری رو هر بار پاس میده به پیمایش بعدی خودش
بیشتر برای جمع کردن ازش استفاده میشه مثلا [1,2,3,4,5] همچین ارایه ای رو داری بخایی جمع کنی به شکل زیر عمل میکنی

[1,2,3,4,5].reduce((sum,item)=>sum+item)

خروجی کد بالا میشه 15
در اصل باید sum+item رو return کرد اما مثل map چون از arrow function داریم استفاده میکنیم و یک خطی هست خودش انجام میده.

 تصویر

حالا شما طبق کدی که فرستادم یه کرایه داری که گروه بندی شده و در ابتدا خالیه
توی هر مرحله اول گروه رو پیدا میکنی هر جایی از news خودت که هست

const { category } = product;

مرحله ی بعد باید توی ارایه ی دسته بندی شده هات بیایی و اون خبر رو قرار بدی اول چک میکنی که ایا اصلا من همچین دسته ای دارم یا نه
اگر دارم که هیچی اگر نه یه ارایه خالی توش میزارم با نام این دسته تا بعد بتونم توش چیزی بریزم

group[category] = group[category] ?? [];

حالا که مطمینی همچین دسته ای و ارایه ای هست push میکنی

group[category].push(product);

و فراموش نکن ته ته کارات اون ارایه دسته بندی هاتو برای پیمایش بعدی return کنی

 return group;

اون براکت اخر reduce هم مقدار initialize هست برای category که در ابتدا یک ابجکت خالی تعریف شده


سعید
@رحیم زاده 1 سال پیش مطرح شد
0

دستت درد نکنه داداش. یه توضیح که بدم در خصوص کار.
من سایتم خبری هستش و داخل دیتابیس خودم یه جدول اخبار News دارم و یه جدول دسته بندی categori دارم .
داخل دسته بندی ها به ترتیب اخبار تهران ، اخبار کرج ، اخبار قزوین و ... ایجاد کردم
اخبار خودم رو بر اساس دسته بندی های مختلف بارگزاری کردم . مثلا اخبار تهران ، اخبار کرج ،اخبار قزوین و غیره
حالا من داخل منوهای خودم به صورت مجزا تهران ، کرج ، قزوین و غیره گذاشتم که میخوام خبرهای تهران مجزا نمایش داده بشه از طریق منو و همینطور شهرهای دیگه بر حسب دسته بندی جدا بشه

الان داخل دیتابیس برای news به ترتیب id , title , desc , catId ,url و غیره گذاشتم که یه خبری که بارگزاری میکنم catId داره و id مربوط به همون دسته بندی ها می باشد.
catId اخبار تهران الان 1 هستش .

خب کدی که نوشتم رفتم از داخل News تمام خبرهای بارگزاری شده رو فراخوانی کردم و اومدم با استفاده از کد زیر کفتم که بر حسب catId خبرهارو نمایش بده


سعید
@رحیم زاده 1 سال پیش مطرح شد
0
order: ['catId' , 'DESC'],

سعید
@رحیم زاده 1 سال پیش مطرح شد
0

اما الان داره به من اخبار رو بر اساس تمام دسته بندی ها به نمایش میزاره و اون catId که برای اخبار تهران 1 هستش رو نمیتونم بگیرم.


محمد رضا
تخصص : Full Stack Developer
@salar.mohammad2013 1 سال پیش مطرح شد
0

دوست عزیز ببین طبق همون لینکی که فرستادم Object.groupBy() داریم مثال زیر خیلی واضح هست

const products = [
  { name: 'apples', category: 'fruits' },
  { name: 'oranges', category: 'fruits' },
  { name: 'potatoes', category: 'vegetables' }
];

const groupByCategory = Object.groupBy(products, product => {
  return product.category;
});

console.log(groupByCategory); 
// {
//   'fruits': [
//     { name: 'apples', category: 'fruits' }, 
//     { name: 'oranges', category: 'fruits' },
//   ],
//   'vegetables': [
//     { name: 'potatoes', category: 'vegetables' }
//   ]
// }

من بازم شرمنده با nodejs کار نکردم نمیدونم عرف دیتابیس چیه ک راحت باشید و چ امکاناتی داره سرچ که کردم node به هر دیتابیسی وصل میشه تاجایی ک من میبینم و اگر دیتابیست mysql هست خیلی راحت از groupBy و where میتونی استفاده کنی
شما برای مثلا تهران صحیح نیست که همه ی خبر ها رو بگیری بعد بیایی تهران رو براش جدا کنی جون بعد یک ماه یا پنج ماه ممکنه یک میلیون خبر داشته باشی یا نصف این مقدار
دریافت این حجم خبر یکجا و گروه بندی اون بعد از دریافت هم فضای رم میگیره هم سرعت سایتت پایین میاره و گاهی هم خطا میخوری و کرش میکنه پروژت
حتما این نوع چینش رو با درخواست های دیتابیسی هندل کن تا داده ی اضافی نگیری
ولی اگر کمه داده ها نیازه که به این شکل انجام بشه مثلا بالا و مثلا قبلی که فرستادم هر دو به راحتی برات گروه بندی میکنن و چیزی که شما sort قرار دادی مرتب سازی هست و فقط به ترتیب چینش ربط داره و نه گروه بندی و تقسیم کردنشون


سعید
@رحیم زاده 1 سال پیش مطرح شد
0

تعداد اخبار زیاد نیست ، خبرهای خاص رو کار میکنیم.
روشی که گفتید تا حدودی متوجه میشم اما متاسفانه کدهایی که من نوشتم جوری هست که نمیشه جایگزین کرد.خیلی هم وارد نیستم متاسفانه


محمد رضا
تخصص : Full Stack Developer
@salar.mohammad2013 1 سال پیش مطرح شد
1

من از نظر جاوا اسکریپت و واکشی دیتا بیس نظرمو گفتم خدمتتون، دیگه فک میکنم راهنمایی بیشتر اگر نیازدارید اقای نظری @mahdi.nazari بهتر میتونن شما رو راهنمایی کنن


برای ارسال پاسخ لازم است وارد شده یا ثبت‌نام کنید

ورود یا ثبت‌نام