簡體   English   中英

MongoDB 聚合最后一條記錄並將某些字段匹配到過去 30 天

[英]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
                            ]}
                        }
                    },

當所有值都不為空或缺失時, minmax忽略空值和缺失值。

您可以使用上述想法來構建以下查詢。

“今天”是日期時間 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM