Bạn sẽ cần $ elemMatch và tổng hợp .
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"
}
}
])
Vì vậy, truy vấn sẽ thực hiện các bước sau:
-
$unwindtất cảSessionsphần tử -
$matchtài liệu trong phạm vi ngày -
$groupcùng nhau các tài liệu theo_id,First_Name,Last_Name -
$projecttài liệu trông giống như định dạng ban đầu
Tôi đã bỏ qua một số trường, nhưng bạn có thể dễ dàng thêm nó vào $group và $project các bước. Và tất nhiên, bạn sẽ cần thay đổi phạm vi ngày.
Tôi lo ngại về hiệu suất của truy vấn này trong một bộ sưu tập lớn. Có lẽ tốt hơn nếu bạn sử dụng truy vấn đầu tiên tôi đưa ra và lọc các phiên bạn muốn trong mã của mình.
Chỉnh sửa:
Như @chridam đã nói, truy vấn này sẽ chỉ hoạt động nếu bạn thay đổi Last_Login thành ISODate() , những gì được khuyến nghị.
Chỉnh sửa 2:
Cập nhật truy vấn để sử dụng aggregate và khớp với yêu cầu chỉ tìm nạp Sessions trong phạm vi ngày.
Đây là phiên bản cũ:
db.users.filter({
'Sessions': {
'$elemMatch': {
'Last_Login': {
'$gte': ISODate("2016-06-16T00:00:00.0Z"),
'$lt': ISODate("2016-06-17T00:00:00.0Z")
}
}
}
})