您需要使用_get_collection() 访问器从pymongo 集合中获取底层.aggregate() 方法,然后使用$project 来创建截断的日期信息。
您可以使用date aggregation operators:
Product._get_collection.aggregate([
{ "$project": {
"product_id": 1,
"saves": 1,
"title": 1,
"gender": 1,
"date": 1,
"partDate": {
"year": { "$year": "$date.created" },
"dayOfYear": { "$dayOfYear": "$date.created" }
}
}},
{ "$sort": {
"partDate.year": -1,
"partDate.dayOfYear": -1,
"saves": -1
}}
])
或者用日期数学代替:
Product._get_collection.aggregate([
{ "$project": {
"product_id": 1,
"saves": 1,
"title": 1,
"gender": 1,
"date": 1,
"truncDate": {
"$subtract": [
{ "$subtract": [
"$date.created",
datetime.datetime.utcfromtimestamp(0)
] },
{ "$mod": [
{ "$subtract": [
"$date.created",
datetime.datetime.utcfromtimestamp(0)
] },
1000 * 60 * 60 * 24
]}
]
}
}},
{ "$sort": { "truncDate": -1, "saves": -1 }}
])
当您对 Date BSON 对象进行数学运算时,后者的工作原理是从纪元开始的秒数的 unix 时间戳值。因此减去纪元日期会产生一个时间戳值,然后将其四舍五入为一天。
-- 编辑--
更好的是,多做一点数学运算,然后您返回一个 BSON Date,它会转换回 API。只需应用 $add 将数值转回 BSON 日期:
Product._get_collection.aggregate([
{ "$project": {
"product_id": 1,
"saves": 1,
"title": 1,
"gender": 1,
"date": 1,
"truncDate": {
"$add": [
{ "$subtract": [
{ "$subtract": [
"$date.created",
datetime.datetime.utcfromtimestamp(0)
]},
{ "$mod": [
{ "$subtract": [
"$date.created",
datetime.datetime.utcfromtimestamp(0)
]},
1000 * 60 * 60 * 24
]}
]},
datetime.datetime.utcfromtimestamp(0)
]
}
}},
{ "$sort": { "truncDate": -1, "saves": -1 }}
])
与其余转换中使用的基本纪元日期应用程序相同。
-- 结束--
然后您可以在相应的字段上$sort。
当然,这些是“原始”对象,不再是 mongoengine 文档,但是聚合输出很少与集合输入完全相同。当然,在这种情况下,您可以选择相关字段并在需要时重新转换为您的文档类型。或者按原样处理结果。