MongoDB 年龄组按生日日期聚合

时间:2021-07-21 13:36:16

标签: mongodb mongodb-query aggregate

我有这样的 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" } } } }
            }
        }
    ]
)

但我不知道接下来该怎么做。

1 个答案:

答案 0 :(得分:0)

您可以通过此投影获得年龄:

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