我正在尝试使用每个$ src的最后/最新值返回,但在#inches字段中获得30天$ min和$ max。请参阅以下查询
date = datetime.datetime.today() - datetime.timedelta(days=31)
last_data = collection.aggregate([
{"$group": {"_id": "$src",
"date": {"$last": "$time"},
"inches": {"$last": "$inches"},
"low":{"$min":"$inches"},
"high":{"$max":"$inches"}
} }
])
除了LOW和HIGH都是永远低和高的时候,这个工作正常。我想限制低和高只在最近30天内拉。如果可能,使用datetime timedelta对象。
以下是从特定日期返回所有数据的示例。我不知道该怎么办将两个查询合并为一个。
data = collection.find({'time':{ "$gte" : (date) }})
更新1:尝试以下代码...
注意:日期是30天后的纪元时间 今天= 1508360994.741111 日期= 1505682594.741111
collection.aggregate([
{"$group": {"_id": "$src",
"date": {"$last": "$time"},
"inches": {"$last": "$inches"},
"low": {
"$min": {
"$cond": [
{"time": {"$lte": ["$time", date]}},
"$inches",
None
]
}
},
"high": {
"$max": {
"$cond": [
{"time": {"$gte": ["$time", date]}},
"$inches",
None
]
}
},
}}
])
我得到这样的回报:所以看起来它可能正在发挥作用。我需要做一些健全检查以确保。 {'_ id':'c4028504','date':datetime.datetime(2017,10,16,2,47,21,939000),'inches':85.0,'low':0,'high':2007.25} ,
如何添加第二个条件以仅显示低点> 0.见下面我粗暴的尝试。
"low": {
"$min": {
"$cond": [ { "$and" : [
{ "time": {"$gte": ["$time", date] },
{ "inches": {"$gt": ["$inches", 0] }
]},
"$inches",
None
]}
}
},
答案 0 :(得分:1)
min
& max
当所有值都不为空或缺失时,忽略空值和缺失值。
您可以使用以上构思构建以下查询。
"今天"是datetime utc值和" date"是以毫秒为单位的增量。 (例如:30 * 86400 * 1000,为期30天)。
本质上使用条件运算符,计算$time
和"今天"之间的差异。并比较看,如果差异小于输入值(以毫秒为单位),则$inches
否则为null
。
"low": {
"$min": {
"$cond": [
{
"$lte": [
{
"$subtract": [
"$time",
today
]
},
date
]
},
"$inches",
null
]
}
}
您可以为$max
(高)应用类似的逻辑并调整python的答案。