mongodb - how to find and then aggregate

Mongodb

Mongodb Problem Overview


I have collection that contains documents with below schema. I want to filter/find all documents that contain the gender female and aggregate the sum of brainscore. I tried the below statement and it shows a invalid pipeline error.

db['!all'].aggregate({ $and: [ {'GENDER' :  'F'} , {'DOB' : { $gte : 19400801, $lte : 20131231 }} ]  }, { $group : { _id : "$GENDER", totalscore : { $sum : "$BRAINSCORE" } } } )

Schema:

{
    "_id" : ObjectId("53f63fc8f2b643f6ebb8a1a9"),
    "DOB" : 19690112,
    "GENDER" : "F",
    "BRAINSCORE" : 65
},
{
    "_id" : ObjectId("53f63fc8f2b643f6ebb8a1a2"),
    "DOB" : 19950116,
    "GENDER" : "F",
    "BRAINSCORE" : 44
},
{
    "_id" : ObjectId("53f63fc8f2b643f6ebb8a902"),
    "DOB" : 19430216,
    "GENDER" : "M",
    "BRAINSCORE" : 71
}

Mongodb Solutions


Solution 1 - Mongodb

You have to use $match:

db['!all'].aggregate([
  {$match:
    {'GENDER': 'F',
     'DOB':
      { $gte: 19400801,
        $lte: 20131231 } } },
  {$group:
     {_id: "$GENDER",
     totalscore:{ $sum: "$BRAINSCORE"}}}
])

Outputs:

{ "_id" : "F", "totalscore" : 109 }

Solution 2 - Mongodb

Sample working query :

db.getCollection('NOTIF_EVENT_RESULT').aggregate([
{$match:
    {'userId': {'$in' : ['user-900', 'user-1546']},
    'criteria.operator': 'greater than', 'criteria.thresold' : '90', 'category' : 'capacity'}
},
{"$group" :  {_id : {userId:"$userId"}, "count" : { "$sum" : 1} } }
])

Solution 3 - Mongodb

Here is an answer if the DOB numbers needs to be converted to Date then compared. If not, a number or Date such as 1970 will be incorrectly $gte to 19400801 (you can try):

db['!all'].aggregate([
	{
		$addFields: {
			"_temp_DOB": {
				$dateFromString: {
					dateString: {$toString: {$toLong: "$DOB"}},
					format: "%Y%m%d"
				}
			}
		}	
	},
	{
		$match: {
			'GENDER': 'F', 
			'_temp_DOB': { $gte: new Date("1940-08-01"),  
				           $lte: new Date("2013-12-31") }
		}
	},
	{
		$group: {
			_id: "$GENDER", 
			totalscore: { $sum: "$BRAINSCORE" }
		}
	}
])

Outputs:

{ "_id" : "F", "totalscore" : 109 }

Solution 4 - Mongodb

In addition to Enrique's answer,

If you want to aggregate using a user's id, (which is a mongoose objectID), you need to cast your query id (which is of type string) to mongoose objectID. Thus:

const userId = mongoose.Types.ObjectId(user_id). 

Else, $match it will return an empty array.

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionLAX_DEVView Question on Stackoverflow
Solution 1 - MongodbEnrique FueyoView Answer on Stackoverflow
Solution 2 - MongodbBinita BharatiView Answer on Stackoverflow
Solution 3 - MongodbYi Xiang ChongView Answer on Stackoverflow
Solution 4 - MongodbAustinView Answer on Stackoverflow