With a little imagination (pre mongo v 2.6) ...
You can do this with aggregate or map reduce. Aggregate is newer, easier and more optimized. Here's a sample of returning a sub document with aggregate assuming your collection is named "Authors". I took the liberty of spelling things correctly.
Authors.aggregate([
{ $match: { author: 'xyz' } },
{ $unwind: '$books' },
{
$project: {
_id: '$books.book1',
date: '$books.date'
}
},
{ $match: { '$_id' : 'b1' } }
]);
You'll get back an array with a single entry like so:
[{ _id: 'b1', date: '2-4-00' }]
Otherwise, if mongo 2.6+ you can do the really easy way:
Authors.find({
author: 'xyz',
books: { $elemMatch: { book1: 'b1' } }
},'books')
Where you will get back the books collection if found and only a single record within:
{ _id: 'xyz', books: [ { book1: 'b1', date: '2-4-00' } ] }