[英]MongoDB Aggregate Last Records and Match some fields to last 30 days
我試圖獲得每個 $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
]}
}
},
當所有值都不為空或缺失時, min
和max
忽略空值和缺失值。
您可以使用上述想法來構建以下查詢。
“今天”是日期時間 utc 值,“日期”是以毫秒為單位的增量。 (例如:30 * 86400 * 1000 30 天)。
本質上使用條件運算符,計算$time
和“今天”之間的差異並比較以查看,如果差異小於輸入值(以毫秒為單位),則$inches
else null
。
"low": {
"$min": {
"$cond": [
{
"$lte": [
{
"$subtract": [
"$time",
today
]
},
date
]
},
"$inches",
null
]
}
}
您可以對$max
(high) 應用類似的邏輯並調整 python 的答案。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.