group in mongo excluding null values
You need an extra $match
pipeline step that will filter the incoming documents based on the embedded field "$productAttribute.colour"
existing and not null:
db.productMetadata.aggregate([
{ $match: {
"productAttribute.colour": {
$exists: true,
$ne: null
}
} },
{ $group: {
_id: {
color: "$productAttribute.colour",
gender: "$productAttribute.gender"
},
count: { $sum: 1 }
} }
]);
this example includes two different Collections. For this we use aggregate function. I am also using Mongoose
- I am joining the cusmtomfield with customfiellabels with $lookup
- Flat the array with $unwind
- $match to exclude the name that have INACTIVE in the text (I'm using REGEX)
$project to rename the Fields to show properly on the client
. async getAllMasterDataCustomFields(req) {
let response = {}; try { response = await customfieldsModel.aggregate([ { $lookup: { from: 'customfieldlabels', localField: 'cfId', foreignField: 'cfId', as: 'info' } }, { '$unwind': { 'path': '$info', 'preserveNullAndEmptyArrays': true } }, { '$match': { 'childs.name': { $not: /INACTIVE/ }}}, { $project: { 'cfId': 1, 'label': '$info.label', 'type': '$info.type', 'childs': 1 } }]).exec(); } catch (e) { logger.log('error', `Error while getting response ${e.meesage}`); } return response; }
.