{
"_id" : ObjectId("576155a6cd87b68f7e6e42c9"),
"First_Name" : "ok",
"Last_Name" : "jaao",
"Email" : "xyz@gmail.com",
"Sessions" : [
{
"Last_Login" : "Wed, Jun 14, 2016 6:48 PM",
"Class" : "fb",
"ID" : "123"
},
{
"Last_Login" : "Wed, Jun 15, 2016 6:48 PM",
"ID" : "111",
"Class" : "fb"
}
],
"Count" : 2
},
{
"_id" : ObjectId("576155ccf6d8979e7e77df27"),
"First_Name" : "abc",
"Last_Name" : "xyz",
"Email" : "xyz@gmail.com",
"Sessions" : [
{
"Last_Login" : "Wed, Jun 15, 2016 6:49 PM",
"Class" : "fb",
"ID" : "123"
}
],
"Count" : 1
}
这是我的json结构.我想要一个mongoDB查询,它检索今天登录的每个用户,即Last_Login今天的日期.
我希望我的输出为:
{
"_id" : ObjectId("576155a6cd87b68f7e6e42c9"),
"First_Name" : "ok",
"Last_Name" : "jaao",
"Email" : "xyz@gmail.com",
"Sessions" : [
{
"Last_Login" : "Wed, Jun 15, 2016 6:48 PM",
"ID" : "111",
"Class" : "fb"
}
],
"Count" : 2
},
{
"_id" : ObjectId("576155ccf6d8979e7e77df27"),
"First_Name" : "abc",
"Last_Name" : "xyz",
"Email" : "xyz@gmail.com",
"Sessions" : [
{
"Last_Login" : "Wed, Jun 15, 2016 6:49 PM",
"Class" : "fb",
"ID" : "123"
}
],
"Count" : 1
}
最佳答案 你需要
$elemMatch和
aggregate.
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"
}
}
])
所以查询将执行以下步骤:
> $展开所有Sessions元素
> $匹配日期范围内的文档
> $by _id,First_Name,Last_Name组合文档
> $project文档看起来像原始格式
我省略了一些字段,但您可以在$group和$project步骤中轻松添加它.当然,您需要更改日期范围.
我很关心这个查询在大集合中的表现.如果你使用我给出的第一个查询并在你的代码中过滤你想要的会话,也许会更好.
编辑:
正如@chridam所说,只有将Last_Login更改为ISODate()时,此查询才有效.
编辑2:
更新查询以使用聚合并匹配日期范围内仅获取Sessions的请求.
这是旧版本:
db.users.filter({
'Sessions': {
'$elemMatch': {
'Last_Login': {
'$gte': ISODate("2016-06-16T00:00:00.0Z"),
'$lt': ISODate("2016-06-17T00:00:00.0Z")
}
}
}
})