Refer to question Match conditions and latest date from array whose good solution is provided by Neil Lunn.
db.chat.find().pretty().limit(2)
{
    "_id" : ObjectId("593921425ccc8150f35e7662"),
    "user1" : 1,
    "user2" : 2,
    "messages" : [
        {
            "sender" : 1,
            "datetime" : ISODate("2017-05-01T00:00:00Z"),
            "body" : "hiii 120"
        },
        {
            "sender" : 1,
            "datetime" : ISODate("2017-06-01T00:00:00Z"),
            "body" : "hiii 121"
        },
        {
            "sender" : 2,
            "datetime" : ISODate("2017-06-10T00:00:00Z"),
            "body" : "hiii 2"
        }
    ]
}
{
    "_id" : ObjectId("593921425ccc8150f35e7663"),
    "user1" : 1,
    "user2" : 3,
    "messages" : [
        {
            "sender" : 1,
            "datetime" : ISODate("2017-05-02T00:00:00Z"),
            "body" : "hiii 130"
        },
        {
            "sender" : 1,
            "datetime" : ISODate("2017-06-02T00:00:00Z"),
            "body" : "hiii 131"
        },
        {
            "sender" : 3,
            "datetime" : ISODate("2017-06-10T00:00:00Z"),
            "body" : "hiii 2"
        }
    ]
}
The problem statement here is I need list of users where messages.sender=1 order by datetime desc.
i.e output :
    {
        "sender" : 1,
        "receiver" : 2,
        "datetime" : ISODate("2017-06-02T00:00:00Z"),
        "body" : "hiii 131"
    },
    {
        "sender" : 1,
        "receiver" : 2,
        "datetime" : ISODate("2017-06-01T00:00:00Z"),
        "body" : "hiii 121"
    },                      
    {
        "sender" : 1,
        "receiver" : 3,
        "datetime" : ISODate("2017-05-02T00:00:00Z"),
        "body" : "hiii 130"
    },
    {
        "sender" : 1,
        "receiver" : 3,
        "datetime" : ISODate("2017-05-01T00:00:00Z"),
        "body" : "hiii 120"
    },
Tried many query but not able to get the desired output.
Explanation the output :
db.chat.find().pretty().limit(2)
{
    "_id" : ObjectId("593921425ccc8150f35e7662"),
    "user1" : 1,
    "user2" : 2,
    "messages" : [
        {
            "sender" : 1,
            **"datetime" : ISODate("2017-05-01T00:00:00Z"),**--- message will apear at No4 as sender=1. Also we need data of user1/user2 which is not equal to 1 i.e 2.
            "body" : "hiii 120"
        },
        {
            "sender" : 1,
            **"datetime" : ISODate("2017-06-01T00:00:00Z"),**--- message will apear at No2 as sender=1. Also we need data of user1/user2 which is not equal to 1 i.e 2.
            "body" : "hiii 121"
        },
        {
            "sender" : 2,
            "datetime" : ISODate("2017-06-10T00:00:00Z"),
            "body" : "hiii 2"
        }
    ]
}
{
    "_id" : ObjectId("593921425ccc8150f35e7663"),
    "user1" : 1,
    "user2" : 3,
    "messages" : [
        {
            "sender" : 1,
            **"datetime" : ISODate("2017-05-02T00:00:00Z"),** --- message will apear at No3 as sender=1. Also we need data of user1/user2 which is not equal to 1 i.e 3.
            "body" : "hiii 130"
        },
        {
            "sender" : 1,
            **"datetime" : ISODate("2017-06-02T00:00:00Z"),** --- message will apear at top as sender=1 and of max datetime. Also we need data of user1/user2 which is not equal to 1 i.e 3.
            "body" : "hiii 131"
        },
        {
            "sender" : 3,
            "datetime" : ISODate("2017-06-10T00:00:00Z"),
            "body" : "hiii 2"
        }
    ]
}
