MongoDB & Node.js - Как суммировать поле с $ eq и $ cond, где выражение является массивом объектов - PullRequest
1 голос
/ 27 марта 2020

у нас есть этот код. Пожалуйста, убедитесь, что у нас есть эти свойства в

$project:
sumVentaWp
sumVentaMail
sumAlquilerWp
sumAlquilerMail

Основная цель - получить сумму с условием, проблема в том, что dwellingDetail и dwellingDetail.publicationType являются массивами объектов, и я думаю, что мы можем не сравнить его с "Venta" (поэтому он всегда возвращает 0). $eq: ["$dwellingDetail.publicationType", "Venta"] Есть ли способ проверить определенный объект в dwellingDetail?

                    {
                        $lookup: {
                            localField: '_id',
                            from: 'inquiries', //the collection name, (bad)before i had Phrase as the model
                            foreignField: 'agencyId',
                            as: 'inquiries'
                        },

                    },

                    {
                        $lookup: {
                            localField: 'inquiries.dwellingId',
                            from: 'dwelling', //the collection name, (bad)before i had Phrase as the model
                            foreignField: '_id',
                            as: 'dwellingDetail'
                        },
                    },
                    {
                        $match: {
                            'deleted': false,

                        }
                    },                    

                    { $sort: { name: 1 } },


                    {
                        $project: {
                            agencyname: '$name',
                            agencyId: '$_id',
                            sumVentaWp: {
                                $sum: { $cond: { if: { $eq: ["$dwellingDetail.publicationType", "Venta"] }, then: 1, else: 0 } }
                            },
                            sumVentaMail: {
                                $sum: { $cond: [{ $eq: ['$dwellingDetail.publicationType', "Venta"] }, 1, 0] }
                            },
                            sumAlquilerWp: {
                                $sum: { $cond: [{ $eq: ['$dwellingDetail.publicationType', "Alquiler"] }, 1, 0] }
                            },
                            sumAlquilerMail: {
                                $sum: { $cond: [{ $eq: ['$dwellingDetail.publicationType', "Alquiler"] }, 1, 0] }
                            },
                            pubType: '$dwellingDetail.publicationType',

                            whatsappcounter: {
                                $sum: '$inquiries.whatsappcounter'
                            },
                            mailcounter: { $sum: '$inquiries.mailcounter' },
                            'detail._id': '0'
                        }
                    }

                ]).exec();```

1 Ответ

0 голосов
/ 27 марта 2020

Вы не можете сравнить ['Venta'] с 'Venta', вместо этого вы можете использовать $ in :

{
    $project: {
        agencyname: '$name',
        agencyId: '$_id',
        sumVentaWp: {
            $sum: { $cond: [{ $in: [ "Venta","$dwellingDetail.publicationType"] }, then: 1, else: 0 ] }
        },
        sumVentaMail: {
            $sum: { $cond: [{ $in: [ "Venta", '$dwellingDetail.publicationType'] }, 1, 0] }
        },
        sumAlquilerWp: {
            $sum: { $cond: [{ $in: ["Alquiler",'$dwellingDetail.publicationType'] }, 1, 0] }
        },
        sumAlquilerMail: {
            $sum: { $cond: [{ $in: [ "Alquiler",'$dwellingDetail.publicationType'] }, 1, 0] }
        },
        pubType: '$dwellingDetail.publicationType',

        whatsappcounter: {
            $sum: '$inquiries.whatsappcounter'
        },
        mailcounter: { $sum: '$inquiries.mailcounter' },
        'detail._id': '0'
    }
}

Примечание: На всякий случай, если вы несколько условий для проверки, вы можете попробовать использовать $ switch .

...