我一直在努力寻找解决这个问题的几天,但没有运气。
我有一个具有以下结构的集合:
{
"_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格式的变量放在它给我错误的文档中。
任何帮助,建议都会非常感激。
答案 0 :(得分:2)
我读了你必须保持当前数据类型的原因。我也认为使用字符串来保存日期是很愚蠢的(因为你会改变它们,所以很难也没用)。
所以这里有一个解决方案:离开旧string-data
字段并创建一个新字段,您可以将其正确转换为Date()
。这样您的旧代码仍然可以正常工作,但您将为聚合框架使用新的日期字段。在reading this之后,这将是微不足道的,并了解您必须查找{"$lte": start}
,其中start是当前日期 - 18年。