2017-10-18 103 views
1

我想獲得每個$ src的最後/最新值的回報,但也獲得30天的$ min和$ max #inches字段。看到下面的查詢MongoDB聚合最後的記錄和匹配一些字段到最後30天

 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"} 
        } } 
    ]) 

這工作正常,除了低和高都是時間永遠低和高。我想在最近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

你可能會發布一些示例數據? – dnickless

回答

1

兩個min & max忽略空和缺失值相比,當所有的值不爲空或丟失。

你可以使用上面的想法建立下面的查詢。

「today」是日期時間utc值,「date」是以毫秒爲單位的增量。 (例如:30 * 86400 * 1000 30天)。

在本質上使用條件運算,計算$time和「今天」之間的差異,並比較看,如果差值小於輸入值(以毫秒爲單位),然後$inches其他null

"low": { 
    "$min": { 
    "$cond": [ 
     { 
     "$lte": [ 
      { 
      "$subtract": [ 
       "$time", 
       today 
      ] 
      }, 
      date 
     ] 
     }, 
     "$inches", 
     null 
    ] 
    } 
} 

您可以應用類似的邏輯$max(高)和蟒蛇調整答案。

+0

我更新了我的OP,試圖實現您提供的代碼。任何想法,爲什麼我得到相同的結果低和高?對不起,我對mongo仍然很陌生,試圖讓我的腿來自sql。 –

+0

不用擔心。您的語法不正確。嘗試' 「低」:{ 「$分鐘」:{ 「$ COND」:[{ 「$ LTE」: 「$時間」,日期]}, 「$英寸」, 無 ] } }' – Veeram

+0

我更新了我的OP,我沒有得到的是爲什麼它是<= and not > =如果我說我想在過去30天的所有數據,我說cond是> 30天后,不會<=給我在30天之前? –