Ankit Chaudhari
Ankit Chaudhari

Reputation: 21

How to match and retrieve specific Sub-document value from Mongo

How can I search and retrieve only "Stats.item.id" from this collection who have greater than zero "Stats.item.p" value. I am also facing problem in unwinding this collection.

{ 
 "_id" : "8643", 
"Stats" : [  
    {
        "date" : ISODate("2014-02-01"), 
        "Stats" : {
            "item" : [ 
                {
                    "id" : "4356"
                }, 
                {
                    "id" : "9963", 
                    "p" : NumberInt(1)
                }
            ]
        }
    }
]

}

{ 
 "_id" : "8643",
 {
    "date" : ISODate("2014-02-01"), 
    "Stats" : {
        "item" : [
         {
                    "id" : "9963", 
                    "p" : NumberInt(1)
                }
 }

This is the output I expect. Can anyone help me write this aggregation? oooooooooooooooooooooooooooooooooooooooooooooo ooooooooooooooooooooooooo oooooooooooooooooooo oooooooooooo oooooooo

Upvotes: 1

Views: 36

Answers (2)

Murugan Perumal
Murugan Perumal

Reputation: 985

Hope this aggregation query will work

db.collection.aggregate([
{$unwind:'$Stats'},
{$unwind:'$Stats.Stats'},
{$unwind:'$Stats.Stats.item'},
{$match:{
    'Stats.Stats.item.p':{$gt:0}
}},
{$group:{
    _id:{
        date:'$Stats.date'
    },
    item:{$push:'$Stats.Stats.item'},
    _ids:'$_id'
}},
{$group:{
    _id:{_ids:'$_ids',
    date:'$_id.date'},
    Stats:{$push:{
        item:'$item'
        }},
}},
{$project:{
    _id:'$_id._ids',
    Stats:{
        date:'$_id.date'
        Stats:'$Stats'
    }
}}
])

Upvotes: 1

Rahul Sharma
Rahul Sharma

Reputation: 10071

Use $elemMAtch for searching in the array.

db.getCollection('CollectionName').find({
    "Stats": {
        "$elemMatch": {
            "Stats.item": {
                "$elemMatch": {
                    "p": 1
                }
            }
        }
    }
})

Upvotes: 0

Related Questions