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"
}
]
}