Having, for example, a collection named test and the following document is inside:
{
    "_id" : ObjectId("5692ac4562c824cc5167379f"),
    "list" : [ 
        {
            "name" : "elem1",
            "type" : 1
        }, 
        {
            "name" : "elem2",
            "type" : 2
        }, 
        {
            "name" : "elem3",
            "type" : 1
        }, 
        {
            "name" : "elem4",
            "type" : 3
        }, 
        {
            "name" : "elem4",
            "type" : 2
        }
    ]
}
Let's say I would like to retrieve a list of only those subdocuments inside list that match: 
- type = 2.
I've tried the following query:
db.getCollection('test').find({
    '_id': ObjectId("5692ac4562c824cc5167379f"),
    'list.type': 1
})
But the result I get contains every subdocument inside list, and I guess this is because inside list there are at least one document which's type equals 1.
Instead of that, the result I am interested to obtain would be every subdocument inside list that matches 'list.type': 1:
{
    "_id" : ObjectId("5692ac4562c824cc5167379f"),
    "list" : [ 
        {
            "name" : "elem1",
            "type" : 1
        }, 
        {
            "name" : "elem3",
            "type" : 1
        }
    ]
}
...so $and $elemMatch is not what I am really looking for as they return just the first matching element.
Anyone knows how to achieve what I am looking for?
 
    