用于从嵌套数组集合检索的mongoDB查询
这是我的json结构。我想要一个mongoDB查询,它检索今天登录的每个用户,也就是说,用于从嵌套数组集合检索的mongoDB查询,mongodb,mongodb-query,aggregation-framework,Mongodb,Mongodb Query,Aggregation Framework,这是我的json结构。我想要一个mongoDB查询,它检索今天登录的每个用户,也就是说,上次登录的日期是今天 我希望我的输出为: { "_id" : ObjectId("576155a6cd87b68f7e6e42c9"), "First_Name" : "ok", "Last_Name" : "jaao", "Email" : "xyz@gmail.com", "Sessions" : [ { "Last_Logi
上次登录的日期是今天
我希望我的输出为:
{
"_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
}
你将需要和
因此,查询将执行以下步骤:
$unwind
所有会话
元素
$match
日期范围内的文档
$group
按\u id
,名
,姓
$project
使文档看起来像原始格式
我省略了一些字段,但您可以轻松地将其添加到$group
和$project
步骤中。当然,您需要更改日期范围
我担心这个查询在一个大集合中的性能。如果您使用我给出的第一个查询并在代码中过滤您想要的会话,可能会更好
编辑:
正如@chridam所说,只有将Last\u Login
更改为ISODate()
,此查询才会起作用,这是推荐的
编辑2:
更新查询以使用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"
}
}
])
这样存储的日期将需要复杂的查询,而这些查询可能无效。考虑更改您的模式,使其具有<代码> LastIdLogy< /Case>存储为<代码> ISODATE()>代码> LSTYLIGN字段包含以Simul.JS库提供的Simulink(“LLL”)格式的数据,是否仍然需要将其更改为ISODATE(?)??是,最好将MangoDB中的日期存储为适当的数据()类型,而不是将它们存储为上述格式的字符串。你能给我一个以ISODate()插入的例子吗,ryt现在我使用它作为:Last_Login:moment。format('lll')moment()
有一个方法,当它返回JavaScript日期对象或只是创建JS日期对象的新实例时,你可以使用它。所以你可以像Last\u Login:moment().toDate()
或者像Last\u Login:new Date()
那样做,因为Last\u Login
日期是OP以字符串形式给出的。@chridam当然,我没有注意到。它说ISODate()没有定义。。。其他选择??好的。。使用Date()完成,但我没有得到预期的输出。它输出匹配对象中的所有数据,甚至是昨天的登录时间。是否只返回最后一次登录会话?
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"
}
}
])
db.users.filter({
'Sessions': {
'$elemMatch': {
'Last_Login': {
'$gte': ISODate("2016-06-16T00:00:00.0Z"),
'$lt': ISODate("2016-06-17T00:00:00.0Z")
}
}
}
})