Du skal bruge $elemMatch og 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å forespørgslen vil udføre disse trin:
$unwind
alleSessions
elementer$match
dokumenter inden for datointervallet$group
sammen dokumenter efter_id
,First_Name
,Last_Name
$project
dokumenter til at ligne det originale format
Jeg har udeladt nogle felter, men du kan nemt tilføje det i $group
og $project
trin. Og selvfølgelig skal du ændre datointervallet.
Jeg er bekymret over effektiviteten af denne forespørgsel i en stor samling. Måske er det bedre, hvis du bruger den første forespørgsel, jeg gav, og filtrerer de sessioner, du ønsker i din kode.
Rediger:
Som @chridam sagde, vil denne forespørgsel kun fungere, hvis du ændrer Last_Login
til ISODate()
, hvad der anbefales.
Rediger 2:
Opdatering af forespørgslen til at bruge aggregate
og match anmodningen om kun at hente Sessions
inden for datointervallet.
Dette er den gamle version:
db.users.filter({
'Sessions': {
'$elemMatch': {
'Last_Login': {
'$gte': ISODate("2016-06-16T00:00:00.0Z"),
'$lt': ISODate("2016-06-17T00:00:00.0Z")
}
}
}
})