Python Mongo凌乱的DOB字符串字段到年龄

Python Mongo凌乱的DOB字符串字段到年龄,python,mongodb,aggregation-framework,pymongo,Python,Mongodb,Aggregation Framework,Pymongo,我收集了以下文件: {'state': 'NY', 'DOB': '2000-01-02'}, {'state': 'NY', 'DOB': '2002/03/04'}, {'state': 'NY', 'DOB': '00-00-00'}, {'state': 'NY', 'DOB': 'male'}, ... 我想要像这样的输出: {'state': 'NY', 'DOB': '2000-01-02', 'Age': 21}, {'state': 'NY', 'DOB': '2002/03

我收集了以下文件:

{'state': 'NY', 'DOB': '2000-01-02'},
{'state': 'NY', 'DOB': '2002/03/04'},
{'state': 'NY', 'DOB': '00-00-00'},
{'state': 'NY', 'DOB': 'male'},
...
我想要像这样的输出:

{'state': 'NY', 'DOB': '2000-01-02', 'Age': 21},
{'state': 'NY', 'DOB': '2002/03/04', 'Age': 19},
{'state': 'NY', 'DOB': '00-00-00', 'Age': None}, # or Mongo None equivalent
{'state': 'NY', 'DOB': 'male', 'Age': None}, # or Mongo None equivalent
...
我正在PyMongo中构造聚合查询,我想知道是否有一种聚合方法可以尝试将字段转换为Mongo Date对象,然后从中提取
Age
,否则(如果无法提取日期),返回None。下面的外壳中有一些条件吗

def map_age(state, city)
    db.aggregate([
        {'$match': {
             'state': state,
             'DOB': {"$exists": True}, 
             'Age': {"$exists": False}
        }},
        {...}     
    ])

根据@prasad_389;的建议,您必须在
$project
$addFields
阶段使用
$dateFromString
操作符

db.collection.aggregate([
  {
    "$project": {
      "age": {
        "$dateFromString": {
          dateString: "$DOB",
          onError: null,
          onNull: null,
        }
      }
    }
  }
])

根据@prasad_389;的建议,您必须在
$project
$addFields
阶段使用
$dateFromString
操作符

db.collection.aggregate([
  {
    "$project": {
      "age": {
        "$dateFromString": {
          dateString: "$DOB",
          onError: null,
          onNull: null,
        }
      }
    }
  }
])
你可以试试

  • $let
    为dob转换和do操作创建变量
  • $dateFromString
    将字符串转换为日期,如果其有效,则替换为“无”
  • $subtract
    从当前日期减去转换日期
    $$NOW
    您也可以使用
    新日期()
  • $divide
    上面用“31536000000”减去日期表示“3652460601000”
  • $round
    对年龄数字进行舍入
你可以试试

  • $let
    为dob转换和do操作创建变量
  • $dateFromString
    将字符串转换为日期,如果其有效,则替换为“无”
  • $subtract
    从当前日期减去转换日期
    $$NOW
    您也可以使用
    新日期()
  • $divide
    上面用“31536000000”减去日期表示“3652460601000”
  • $round
    对年龄数字进行舍入

为什么不在代码中使用聚合运算符?您可以使用聚合运算符。为什么不在代码中使用聚合运算符?您可以使用聚合运算符。这是否可以适当地处理“YYYY-MM-DD”和“YYYY/MM/DD”这两种情况?是的,它可以。这会适当地处理“YYYY-MM-DD”和“YYYY/MM/DD”这两种情况吗?是的,会。我不确定这是否会产生预期的结果。。。e、 例如,返回标准值,如0.0,在这种情况下,您可以显示示例值。回答得很好。与仅使用
$dateFromString
相比,与
$let
操作结合使用会对性能产生什么影响?只是好奇。提前感谢。性能将影响任何聚合运算符,而不仅仅是
$let
,因此mongodb的经验法则是,您可以添加更多字段,或者可以使用所需格式处理数据库中的重复数据,但不要仅为格式化查询结果而执行更多操作。。。为了处理罕见的情况,我们可以使用这些聚合运算符…@turivishal这毕竟是可行的-您知道如何实现它,以便它实际更新集合中的所有文档吗?我不确定这是否会产生预期的结果。。。e、 例如,返回标准值,如0.0,在这种情况下,您可以显示示例值。回答得很好。与仅使用
$dateFromString
相比,与
$let
操作结合使用会对性能产生什么影响?只是好奇。提前感谢。性能将影响任何聚合运算符,而不仅仅是
$let
,因此mongodb的经验法则是,您可以添加更多字段,或者可以使用所需格式处理数据库中的重复数据,但不要仅为格式化查询结果而执行更多操作。。。为了处理罕见的情况,我们可以使用这些聚合操作符…@turivishal这毕竟是可行的-您知道如何实现它,以便它实际更新集合中的所有文档吗?