• 1403/12/27

فیلتر دو سطحی با aggregate :

سه تا مدل دارم Room -> Project -> Account

const RoomSchema = new BaseSchema({
    project: {
        type: Schema.ObjectId,
        ref: 'Project'
    },
 
})

 

const Project = new BaseSchema({
   owner: {
                type: Schema.ObjectId,
                ref: 'Account'
            },
})

 

روی Room به شکل زیر دارم aggregate  میزنم 

const userRoomsProjects = await RoomModel.aggregate([
                    {
                        $lookup: {
                            from: "projects",
                            localField: "project",
                            foreignField: "_id",
                            as: "project",
                        },
                    },
                    { $match: {"item.owner": userId}}
                ]);

 

میخوام room هایی برگرده که ایدی کاربرشون در project ، برابر با  userId باشه ولی هر کاری کردم نشد؟!

 

  • 1403/12/28
  • ساعت 20:48

باید اول lookup رو انجام بدی و بعد با $match روی project.owner فیلتر کنی اما چون lookup به صورت آرایه برمیگردونه باید چک کنی که آیا owner مقدار userId رو داره یا نه. این کار رو می‌تونی با $unwind حل کنی.

امیدوارم مشکلت رو حل کنه


  • 1403/12/28
  • ساعت 21:53

سلام

 

ممنون بابت راهنماییتون

تازه کارم و نفهمیدم چیکار کنم دقیقا

خواهش میکنم یه نمونه کد بدید ، خیلی گیر  کردم سر این مورد.

 

ممنون استاد 


  • 1403/12/29
  • ساعت 15:02

یه چیزی شبیه به این :

const userRoomsProjects = await RoomModel.aggregate([
    {
        $lookup: {
            from: "projects",
            localField: "project",
            foreignField: "_id",
            as: "project",
        },
    },
    { $unwind: "$project" }, // پروژه رو از آرایه خارج کن
    { $match: { "project.owner": userId } } // فیلتر کردن روی owner پروژه
]);

  • 1403/12/30
  • ساعت 05:15

خیلی ممنون

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

 

سعی کردم با همین کد به نتیجه برسم و حتی تغیرات هم دادم ولی نمیدونم چرا کار نمیکنه؟!


  • 1404/01/02
  • ساعت 15:10

سلام دوست من

سال نو شما هم مبارک

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

با اطلاعاتی که بهم دادی بیشتر از این نمیتونم کمکت کنم


logo-enamadlogo-samandehi