Sie benötigen $elemMatch und aggregieren .
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"
}
}
])
Die Abfrage führt also diese Schritte aus:
$unwind
alleSessions
Elemente$match
Dokumente innerhalb des Datumsbereichs$group
Dokumente nach_id
zusammenfassen ,First_Name
,Last_Name
$project
Dokumente wie das Originalformat aussehen
Ich habe einige Felder weggelassen, aber Sie können sie einfach in $group
hinzufügen und $project
Schritte. Und natürlich müssen Sie den Datumsbereich ändern.
Ich mache mir Sorgen um die Leistung dieser Abfrage in einer großen Sammlung. Vielleicht ist es besser, wenn Sie die erste Abfrage verwenden, die ich gegeben habe, und die gewünschten Sitzungen in Ihrem Code filtern.
Bearbeiten:
Wie @chridam sagte, funktioniert diese Abfrage nur, wenn Sie Last_Login
ändern zu ISODate()
, was empfohlen wird.
Änderung 2:
Aktualisieren der Abfrage zur Verwendung von aggregate
und passen Sie die Anforderung an, nur Sessions
abzurufen innerhalb des Datumsbereichs.
Dies ist die alte Version:
db.users.filter({
'Sessions': {
'$elemMatch': {
'Last_Login': {
'$gte': ISODate("2016-06-16T00:00:00.0Z"),
'$lt': ISODate("2016-06-17T00:00:00.0Z")
}
}
}
})