Не совсем понятна суть вопроса, если имеется в виду получение всех документов содержащих attrib.a. Тогда можно использовать разряженные индексы:
> db.ttt.find(); // документы коллекции
{ "_id" : ObjectId("50377f098537d96af9ea28ae"), "attrib" : { "a" : { }, "b" : { } } }
{ "_id" : ObjectId("50377f0c8537d96af9ea28af"), "attrib" : { "b" : { } } }
{ "_id" : ObjectId("50377f0f8537d96af9ea28b0"), "attrib" : { "a" : { } } }
{ "_id" : ObjectId("50377f138537d96af9ea28b1"), "attrib" : { } }
> db.ttt.ensureIndex({'attrib.a':1}, {sparse : true}); // разряженный индекс
> db.ttt.find().sort({'attrib.a':1}); // в результате будут только документы содержащие attrib.a
{ "_id" : ObjectId("50377f0f8537d96af9ea28b0"), "attrib" : { "a" : { } } }
{ "_id" : ObjectId("50377f098537d96af9ea28ae"), "attrib" : { "a" : { }, "b" : { } } }
> db.ttt.find().hint({'attrib.a':1}); // явно указан индекс
{ "_id" : ObjectId("50377f0f8537d96af9ea28b0"), "attrib" : { "a" : { } } }
{ "_id" : ObjectId("50377f098537d96af9ea28ae"), "attrib" : { "a" : { }, "b" : { } } }
Сразу можно документы с определенным значением attrib.a отбирать. Если необходимо проверять наличие объектов в определенном документе, тогда такой вариант скорее всего не подойдет.