Budete potřebovat $elemMatch a agregát .
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"
}
}
])
Dotaz tedy provede tyto kroky:
$unwind
všechnySessions
prvky$match
dokumenty v daném časovém období$group
společně dokumenty podle_id
,First_Name
,Last_Name
$project
dokumenty, aby vypadaly jako v původním formátu
Některá pole jsem vynechal, ale můžete je snadno přidat do $group
a $project
kroky. A samozřejmě budete muset změnit časové období.
Mám obavy o výkon tohoto dotazu ve velké sbírce. Možná je lepší, když použijete první dotaz, který jsem zadal, a filtrujte relace, které chcete ve svém kódu.
Upravit:
Jak řekl @chridam, tento dotaz bude fungovat, pouze pokud změníte Last_Login
na ISODate()
, co se doporučuje.
Úprava 2:
Aktualizace dotazu tak, aby používal aggregate
a odpovídat požadavku pouze načíst Sessions
uvnitř časového období.
Toto je stará verze:
db.users.filter({
'Sessions': {
'$elemMatch': {
'Last_Login': {
'$gte': ISODate("2016-06-16T00:00:00.0Z"),
'$lt': ISODate("2016-06-17T00:00:00.0Z")
}
}
}
})