【问题标题】:MongoDB Age Group Aggregation by Birthday DateMongoDB 年龄组按生日日期聚合
【发布时间】:2021-09-28 21:19:59
【问题描述】:

我有这样的 MongoDB 文档:

{
    _id: {"$oid":"object_id"},
    email: "email@example.com"
    password: "password_hash"
    info: {
        birthday: "1993-03-12"
        ...
    }
    ...
}

而且我无法改变它。我需要创建 Mongo 查询以按年龄(0-18 岁和 18 岁以上)对用户进行分组。 我不知道怎么处理。我只创建了从生日日期返回年份的查询(这是字符串):

db.users.aggregate(
    [
        {
            $project: {
                year: { $year: { date: { $dateFromString: { dateString: "$info.birthday", format: "%Y-%m-%d" } } } }
            }
        }
    ]
)

但我不确定我接下来应该怎么做。

【问题讨论】:

    标签: mongodb mongodb-query aggregate


    【解决方案1】:

    你可以通过这个投影得到年龄:

    db.collection.aggregate([
       {
          $set: {
             birthday: {
                $dateFromString: {
                   dateString: "$info.birthday",
                   format: "%Y-%m-%d"
                }
             }
          }
       },
       {
          $set: {
             age: {
                $subtract: [
                   { $subtract: [{ $year: "$$NOW" }, { $year: "$birthday" }] },
                   { $cond: [{ $lt: [{ $dayOfYear: "$birthday" }, { $dayOfYear: "$$NOW" }] }, 0, 1] }
                ]
             }
          }
       }
    ])
    

    Mongo Playground

    或者如果您更喜欢变量:

    db.collection.aggregate([
       {
          $set: {
             age: {
                $let: {
                   vars: {
                      birthday: { $dateFromString: { dateString: "$info.birthday", format: "%Y-%m-%d" } }
                   },
                   in: {
                      $subtract: [
                         { $subtract: [{ $year: "$$NOW" }, { $year:  "$$birthday" }] },
                         { $cond: [{ $lt: [{ $dayOfYear: "$$birthday" }, { $dayOfYear: "$$NOW" }] }, 0, 1] }
                      ]
                   }
                }
             }
          }
       }
    ])
    

    您可以根据这个年龄过滤(即$match)或$group

    【讨论】:

    • 谢谢!很好的答案,正是我想要的。
    猜你喜欢
    • 2013-11-25
    • 2019-05-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-25
    • 1970-01-01
    • 1970-01-01
    • 2013-09-12
    相关资源
    最近更新 更多