Python 年龄字段的MongoDB复杂聚合管道

Python 年龄字段的MongoDB复杂聚合管道,python,mongodb,aggregation-framework,pymongo,Python,Mongodb,Aggregation Framework,Pymongo,我有一个MongoDB集合,其中的文档可能包含以下零个或多个字段:DOB(出生日期)、YOB(出生年份)和Age。它们可能包含整数、浮点数或字符串,它们可能映射到实值,也可能不映射到实值。例如: {'_id': id1, 'Age': 25}, {'_id': id2, 'Age': 'unknown', 'DOB': 'xxxx-xx-xx'}, {'_id': id3, 'Age': '8', 'DOB': '1988/01/05'}, {'_id': id4, 'YOB': '1995.0

我有一个MongoDB集合,其中的文档可能包含以下零个或多个字段:
DOB
(出生日期)、
YOB
(出生年份)和
Age
。它们可能包含整数、浮点数或字符串,它们可能映射到实值,也可能不映射到实值。例如:

{'_id': id1, 'Age': 25},
{'_id': id2, 'Age': 'unknown', 'DOB': 'xxxx-xx-xx'},
{'_id': id3, 'Age': '8', 'DOB': '1988/01/05'},
{'_id': id4, 'YOB': '1995.0'},
{'_id': id5, 'DOB': '5/8/1886'},
{'_id': id6, 'Age': 17, 'YOB': 2003},
{'_id': id7},
...
对于数据库中的每个文档,我需要提取一个标准化字段,
Age\u standarized
,其标准如下:

  • 是一个整数
  • is>12
  • 小于99
  • 我还需要在多个字段具有可行值的情况下实现一个优先顺序,因为DOB然后是YOB然后是Age

    因此,例如,如果
    Age
    =17但
    DOB
    =1900',
    Age\u标准化
    =17,因为即使DOB存在(且优先于Age),其产生的Age\u标准化超出可行范围(13-98)

    如果
    YOB
    ='1998.0'和
    Age
    ='19',则
    Age\u标准化
    =23,因为即使年龄存在且可行,YOB也是首选且可行的

    我需要在一个大型集合上实现所有这些,我希望在一个PyMongo聚合框架内实现。在上述示例中,输出为:

    {'_id': id1, 'Age': 25, 'Age_Standardized': 25},
    {'_id': id2, 'Age': 'unknown', 'DOB': 'xxxx-xx-xx'},
    {'_id': id3, 'Age': '8', 'DOB': '1988/01/05', 'Age_Standardized': 33},
    {'_id': id4, 'YOB': '1995.0', 'Age_Standardized': 26},
    {'_id': id5, 'DOB': '5/8/1886'},
    {'_id': id6, 'Age': 17, 'YOB': 2003, 'Age_Standardized': 18},
    {'_id': id7},
    

    年龄字段类型和DOB字段值和格式不一致,因此在查询中执行这些类型的操作不是一个好主意。我建议您更正所有字段的类型和日期格式,以标准化格式,否则您的查询将无法在大型集合中提供性能。这也是您不应将日期值存储为stings的另一个证据。始终存储正确的
    日期
    对象。