Avrai bisogno di $elemMatch e aggregato .
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"
}
}
])
Quindi la query eseguirà questi passaggi:
$unwind
tutte leSessions
elementi$match
documenti all'interno dell'intervallo di date$group
insieme documenti da_id
,First_Name
,Last_Name
$project
documenti in modo che assomiglino al formato originale
Ho omesso alcuni campi, ma puoi aggiungerli facilmente in $group
e $project
passi. E ovviamente dovrai cambiare l'intervallo di date.
Sono preoccupato per le prestazioni di questa query in una grande raccolta. Forse è meglio se usi la prima query che ho fornito e filtri le sessioni che desideri nel tuo codice.
Modifica:
Come ha detto @chridam, questa query funzionerà solo se modifichi Last_Login
a ISODate()
, cosa è consigliato.
Modifica 2:
Aggiornamento della query per utilizzare aggregate
e corrisponde alla richiesta di solo recupero Sessions
all'interno dell'intervallo di date.
Questa è la vecchia versione:
db.users.filter({
'Sessions': {
'$elemMatch': {
'Last_Login': {
'$gte': ISODate("2016-06-16T00:00:00.0Z"),
'$lt': ISODate("2016-06-17T00:00:00.0Z")
}
}
}
})