Does "$eq" aggregation operator works with array dot notation?

First, $and is redundant because there is an implicit and in the query.

Second, $eq is also redundant because FieldName : Value implicitly mean equality.

I would try with simply

­­ db.collection.find( { "data.0.val1" : "xyz" , "data.0.val2" : "abc" } ) ­­

or (which I find easier to read)

­­ db.collection.find( { "data.0" : { "val1" : "xyz" , "val2" : "abc" } ) ­­