Well there is a trick to that, and depending on what you want to do you can take a couple of approaches. The most simple for is a matter of using $project in the aggregation pipeline.
I'm working with a sub-set of what knowledge I have of your fields but the general concept is to define all of them in the $project phase, plus the additional field:
db.collection.aggregate([
// You probably want to do some matching first
// Project your altered document form with a *new* field for "month"
{"$project": {
"Name": 1,
"BirthDate": 1,
"Address": 1,
"month": { "$month": "$BirthDate" } // Extra field for "month"
}},
// Sort by your month value
{"$sort": { "month": 1 }},
// Then just clean the extra part from your projection
// ( if you need to )
{"$project": {
"Name": 1,
"BirthDate": 1,
"Address": 1,
}},
])
If you need to do something more complex, that is going to involve some form of grouping or other operations, then save the document in the _id
as long as you are doing things like grouping on the whole document:
db.collection.aggregate([
// Save your document in the `_id` field
{"$project": {
_id: {
_id: "$_id",
"Name": 1,
"BirthDate": 1,
"Address": 1
}
}},
There was some more example usage of this posted here:
How to get back the Original document back after aggregation