Du behöver $elemMatch och aggregat .
db.users.aggregate([
{
$unwind: "$Sessions"
},
{
$match: {
"Sessions.Last_Login": {
$gte: ISODate("2016-06-16T00:00:00.0Z"),
$lt: ISODate("2016-06-17T00:00:00.0Z")
}
}
},
{
$group: {
_id: {
_id: "$_id",
First_Name: "$First_Name",
Last_Name: "$Last_Name"
},
Sessions: {
$push: "$Sessions"
}
}
},
{
$project: {
_id: "$_id._id",
First_Name: "$_id.First_Name",
Last_Name: "$_id.Last_Name",
Sessions: "$Sessions"
}
}
])
Så frågan kommer att utföra dessa steg:
$unwind
allaSessions
element$match
dokument inom datumintervallet$group
tillsammans dokument med_id
,First_Name
,Last_Name
$project
dokument för att se ut som originalformatet
Jag har utelämnat några fält, men du kan enkelt lägga till det i $group
och $project
steg. Och naturligtvis måste du ändra datumintervallet.
Jag är oroad över resultatet av den här frågan i en stor samling. Kanske är bättre om du använder den första frågan jag gav och filtrerar de sessioner du vill ha i din kod.
Redigera:
Som @chridam sa, den här frågan fungerar bara om du ändrar Last_Login
till ISODate()
, vad som rekommenderas.
Redigera 2:
Uppdaterar frågan för att använda aggregate
och matcha begäran om endast hämta Sessions
inom datumintervallet.
Det här är den gamla versionen:
db.users.filter({
'Sessions': {
'$elemMatch': {
'Last_Login': {
'$gte': ISODate("2016-06-16T00:00:00.0Z"),
'$lt': ISODate("2016-06-17T00:00:00.0Z")
}
}
}
})