按最大创建日期时间从mongo投影整个文档

2024-09-20 03:57:15 发布

您现在位置:Python中文网/ 问答频道 /正文

我创建此查询是为了按文档的最大创建日期时间获取特定日期时间范围内的所有文档。我正在寻找每小时所有最新文件的列表

pipe = [
  {
    "$addFields": {
      "start": {
        "$dateFromString": {
          "dateString": "$StartTime",
          "format": "%Y-%m-%dT%H:%M:%S%z"
        }
      },
      "created": {
        "$dateFromString": {
          "dateString": "$CreatedDateTime",
          "format": "%Y-%m-%dT%H:%M:%S%z"
        }
      }
    }
  },
  {
    "$match": {
      "start": {
        "$gte": start_time,
        "$lte": end_time
      }
    }
  },
  {
    "$sort": {
      "created": -1
    }
  },
  {
    "$group": {
      "_id": "$start",
      "doc": {
        "$first": "$$ROOT"
      }
    }
  },
  {
    "$replaceRoot": {
      "newRoot": "$doc"
    }
  }
]
cursor = COLLECTION.aggregate(pipeline=pipe)

然而,由于我正在使用$addFields,我也在投射startcreated,这是我不需要的。我是否可以复制此查询以排除这些字段并仅包括原始文档。我还想知道这是否是我的解决方案的最佳查询,因此欢迎您提供任何意见或建议

这是一个示例文档:

{
  "StartTime" : "2020-05-01T00:00:00-05:00",
  "EndTime" : "2020-05-01T00:59:59-05:00",
  "Value" : 100,
  "CreatedDateTime" : "2020-05-01T00:00:00-05:00"
}

如果我查询一小时,查询将返回以下结果:

{
  "StartTime" : "2020-05-01T00:00:00-05:00",
  "EndTime" : "2020-05-01T00:59:59-05:00",
  "Value" : 100,
  "CreatedDateTime" : "2020-05-01T00:00:00-05:00",
  "start" : datetime.datetime(2020,05,01),
  "created" : datetime.datetime(2020,05,01)
}

如果要查询多个小时,我要查找的结果是示例文档或示例文档列表


Tags: 文档format示例列表datetime时间start小时
1条回答
网友
1楼 · 发布于 2024-09-20 03:57:15

在聚合管道中不需要$addFields阶段。只需将start_timeend_time转换为字符串。用StartTime替换start,用CreatedDateTime替换created

因此,最后您的查询应该如下所示:

pipe = [{
  "$match": {
    "StartTime": {
      "$gte": start_time,
      "$lte": end_time
    }
  }
},
{
  "$sort": {
    "CreatedDateTime": -1
  }
},
{
  "$group": {
    "_id": "$StartTime",
    "doc": {
      "$first": "$$ROOT"
    }
  }
},
{
  "$replaceRoot": {
    "newRoot": "$doc"
  }
}]
cursor = COLLECTION.aggregate(pipeline=pipe)

在我的例子中,我初始化了start_timeend_time,如下所示:

from datetime import datetime
start_time = datetime.strptime('01 May 2020 00:00:00-05:00', '%d %b %Y %H:%M:%S%z').strftime('%Y-%m-%dT%H:%M:%S%z') # Value: 2020-05-01T00:00:00-05:00
start_time = start_time[:-2]+':'+start_time[-2:]
end_time = datetime.strptime('01 May 2020 00:59:59-05:00', '%d %b %Y %H:%M:%S%z').strftime('%Y-%m-%dT%H:%M:%S%z') # Value: 2020-05-01T00:59:59-05:00
end_time = end_time[:-2]+':'+end_time[-2:]

您可以像上面那样进行一些修改,然后运行查询

简短解释:字符串比较是以词典编纂的方式进行的。因此,"01"小于"02""03"大于"01",同样地,"2020-05-01 00:00:00-05:00"小于等于"2020-05-01T00:00:00-05:00",并且"2020-05-01 00:59:59-05:00"大于等于"2020-05-01T00:00:00-05:00"

我希望以上内容能有所帮助

相关问题 更多 >