Você precisará de $elemMatch e agregado .
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"
}
}
])
Portanto, a consulta fará essas etapas:
$unwind
todas asSessions
elementos$match
documentos dentro do período$group
juntar documentos por_id
,First_Name
,Last_Name
$project
documentos para se parecerem com o formato original
Eu omiti alguns campos, mas você pode adicioná-los facilmente em
$group
e $project
degraus. E é claro que você precisará alterar o intervalo de datas. Estou preocupado com o desempenho desta consulta em uma grande coleção. Talvez seja melhor se você usar a primeira consulta que dei e filtrar as sessões que deseja em seu código.
Editar:
Como @chridam disse, esta consulta funcionará apenas se você alterar
Last_Login
para ISODate()
, o que é recomendado. Editar 2:
Atualizando a consulta para usar
aggregate
e corresponda à solicitação de buscar apenas Sessions
dentro do intervalo de datas. Esta é a versão antiga:
db.users.filter({
'Sessions': {
'$elemMatch': {
'Last_Login': {
'$gte': ISODate("2016-06-16T00:00:00.0Z"),
'$lt': ISODate("2016-06-17T00:00:00.0Z")
}
}
}
})