如何使用聚合框架计算从日期存储为字符串的年龄

时间:2014-03-30 00:31:00

标签: mongodb aggregation-framework

我一直在努力寻找解决这个问题的几天,但没有运气。

我有一个具有以下结构的集合:

{
    "_id" : ObjectId("5336a26b802596dc5b843960"),
    "name" : "jorge",
    "dob" : "19820525"
}
{
    "_id" : ObjectId("5336a2bb802596dc5b843961"),
    "name" : "brandon",
    "dob" : "20100623"
}

我想只返回超过18岁的人。

目标是运行仅显示这些人的报告。如此困难的是将日期字段存储为字符串而不是ISODate。不幸的是,现在我不能只将数据库更新为正确的数据类型,并且映射reduce不是一个选项。最终会是。

我想成为使用当前架构和聚合框架实现该目标的黑客或解决方法。

这是我到目前为止所尝试的:

db.main.aggregate( [ 
    { $project : { name: 1 , 
                  "ageInMillis" : {$subtract : [ISODate(), ISODate("$dob")]} 
                 }
    }
]);

这个问题是我遇到了这个错误:

Sat Mar 29 17:29:06.575 invalid ISO date at src/mongo/shell/types.js:64

奇怪的是,如果我在ISODate构造函数中对字符串进行硬编码,它将起作用但是如果 我把带有$ dob格式的变量放在它给我错误的文档中。

任何帮助,建议都会非常感激。

1 个答案:

答案 0 :(得分:2)

我读了你必须保持当前数据类型的原因。我也认为使用字符串来保存日期是很愚蠢的(因为你会改变它们,所以很难也没用)。

所以这里有一个解决方案:离开旧string-data字段并创建一个新字段,您可以将其正确转换为Date()。这样您的旧代码仍然可以正常工作,但您将为聚合框架使用新的日期字段。在reading this之后,这将是微不足道的,并了解您必须查找{"$lte": start},其中start是当前日期 - 18年。