title: How do I use aggregation operators in a $match in MongoDB (for example $year or $dayOfMonth)?
body: <p>I have a collection full of documents with a created_date attribute.  I'd like to send these documents through an aggregation pipeline to do some work on them.  Ideally I would like to filter them using a $match before I do any other work on them so that I can take advantage of indexes however I can't figure out how to use the new $year/$month/$dayOfMonth operators in my $match expression. </p>
  
  <p>There are a few examples floating around of how to use the operators in a $project operation but I'm concerned that by placing a $project as the first step in my pipeline then I've lost access to my indexes (MongoDB documentation indicates that the first expression must be a $match to take advantage of indexes).</p>
  
  <p>Sample data:</p>
  
  <pre><code>{
      post_body: 'This is the body of test post 1',
      created_date: ISODate('2012-09-29T05:23:41Z')
      comments: 48
  }
  {
      post_body: 'This is the body of test post 2',
      created_date: ISODate('2012-09-24T12:34:13Z')
      comments: 10
  }
  {
      post_body: 'This is the body of test post 3',
      created_date: ISODate('2012-08-16T12:34:13Z')
      comments: 10
  }
  </code></pre>
  
  <p>I'd like to run this through an aggregation pipeline to  get the total comments on all posts made in September</p>
  
  <pre><code>{
      aggregate: 'posts',
      pipeline: [
           {$match:
               /*Can I use the $year/$month operators here to match Sept 2012?
               $year:created_date : 2012,
               $month:created_date : 9
               */
               /*or does this have to be 
               created_date : 
                    {$gte:{$date:'2012-09-01T04:00:00Z'}, 
                    $lt: {$date:'2012-10-01T04:00:00Z'} }
               */
           },
           {$group:
               {_id: '0',
                totalComments:{$sum:'$comments'}
               }
            }
      ]
   }
  </code></pre>
  
  <p>This works but the match loses access to any indexes for more complicated queries:</p>
  
  <pre><code>{
      aggregate: 'posts',
      pipeline: [
           {$project:
                {
                     month : {$month:'$created_date'},
                     year : {$year:'$created_date'}
                }
           },
           {$match:
                {
                     month:9,
                     year: 2012
                 }
           },
           {$group:
               {_id: '0',
                totalComments:{$sum:'$comments'}
               }
            }
      ]
   }
  </code></pre>