Seeing your result, loginLogs.loginTime is an array, so your query will return all userLog, which have a corresponding loginTime value in loginLogs array.
To achieve your needs, you can use aggregation framework :
DATASET :
{
"_id" : ObjectId("5b87f33d9dc5882db7dd81fa"),
"loginLogs" : [
{
"loginTime" : 152.0
},
{
"loginTime" : 167.0
},
{
"loginTime" : 183.0
},
{
"loginTime" : 192.0
},
{
"loginTime" : 202.0
}
]
}
{
"_id" : ObjectId("5b87f3519dc5882db7dd81fb"),
"loginLogs" : [
{
"loginTime" : 154.0
},
{
"loginTime" : 161.0
},
{
"loginTime" : 178.0
},
{
"loginTime" : 194.0
},
{
"loginTime" : 198.0
}
]
}
QUERY:
db.logs.aggregate(
[
{
$unwind: {
path : "$loginLogs",
}
},
{
$match: {
"loginLogs.loginTime":{$gte:170,$lt:195}
}
},
{
$group: {
_id:"$_id",
loginLogs:{$push:"$loginLogs.loginTime"}
}
},
],
);
will output :
{
"_id" : ObjectId("5b87f3519dc5882db7dd81fb"),
"loginLogs" : [
178.0,
194.0
]
}
{
"_id" : ObjectId("5b87f33d9dc5882db7dd81fa"),
"loginLogs" : [
183.0,
192.0
]
}