用于从嵌套数组集合中检索的 mongoDB 查询

标签 mongodb mongodb-query aggregation-framework

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

最佳答案

您将需要 $elemMatchaggregate .

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"
        }
    }
])

因此查询将执行这些步骤:

  1. $unwind 所有 Sessions 元素
  2. $match 日期范围内的文件
  3. $group_idFirst_NameLast_Name 合并文档
  4. $project 文件看起来像原始格式

我省略了一些字段,但您可以在 $group$project 步骤中轻松添加它。当然,您需要更改日期范围。

我担心这个查询在大集合中的性能。如果您使用我给出的第一个查询并在您的代码中过滤您想要的 session ,也许会更好。

编辑:

正如@chridam 所说,只有当您将 Last_Login 更改为 ISODate() 时,此查询才会有效,这是推荐的。

编辑 2:

更新查询以使用 aggregate 并匹配仅获取日期范围内的 Sessions 的请求。

这是旧版本:

db.users.filter({
    'Sessions': {
        '$elemMatch': {
            'Last_Login': {
                '$gte': ISODate("2016-06-16T00:00:00.0Z"),
                '$lt': ISODate("2016-06-17T00:00:00.0Z")
            }
        }
    }
})

关于用于从嵌套数组集合中检索的 mongoDB 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37836891/

相关文章:

mongodb - 如何使用 MongoDB 过滤子文档中的数组

node.js - 使用 Node 驱动程序在主机之间克隆 Mongodb 中的数据库

node.js - 更新 mongodb 时 JavaScript 堆内存不足

javascript - 自定义 MongoDB 查询以返回特定的子文档

c# - mongodb $lookup + 正则表达式

java - 如何从 MongoDB 集合中删除重复项

spring - 提取数组的值并添加到同一个选择的mongoDB中

MongoDB 上的 JSONPath 查询?

javascript - 时间满足收藏值(value)时 meteor 更新

javascript - $从文档中的数组中提取