Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/460.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用于从嵌套数组集合检索的mongoDB查询_Mongodb_Mongodb Query_Aggregation Framework - Fatal编程技术网

用于从嵌套数组集合检索的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

这是我的json结构。我想要一个mongoDB查询,它检索今天登录的每个用户,也就是说,
上次登录的日期是今天

我希望我的输出为:

{
    "_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")
                }
            }
        }
    })