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:
-
$unwind
tất cảSessions
phần tử -
$match
tài liệu trong phạm vi ngày -
$group
cùng nhau các tài liệu theo_id
,First_Name
,Last_Name
-
$project
tà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")
}
}
}
})