Anda memerlukan $elemMatch dan agregat .
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"
}
}
])
Jadi kueri akan melakukan langkah-langkah itu:
$unwindsemuaSessionselemen$matchdokumen dalam rentang tanggal$groupbersama-sama dokumen dengan_id,First_Name,Last_Name$projectdokumen agar terlihat seperti format aslinya
Saya menghilangkan beberapa bidang, tetapi Anda dapat dengan mudah menambahkannya di $group dan $project Langkah. Dan tentu saja Anda harus mengubah rentang tanggal.
Saya khawatir tentang kinerja kueri ini dalam koleksi besar. Mungkin lebih baik jika Anda menggunakan kueri pertama yang saya berikan dan memfilter sesi yang Anda inginkan dalam kode Anda.
Sunting:
Seperti yang dikatakan @chridam, kueri ini hanya akan berfungsi jika Anda mengubah Last_Login ke ISODate() , apa yang direkomendasikan.
Sunting 2
Memperbarui kueri untuk menggunakan aggregate dan cocokkan dengan permintaan hanya ambil Sessions dalam rentang tanggal.
Ini adalah versi lama:
db.users.filter({
'Sessions': {
'$elemMatch': {
'Last_Login': {
'$gte': ISODate("2016-06-16T00:00:00.0Z"),
'$lt': ISODate("2016-06-17T00:00:00.0Z")
}
}
}
})