MongoDB聚合上次记录并将某些字段与过去30天匹配

时间:2017-10-18 17:16:23

标签: python mongodb pymongo

我正在尝试使用每个$ 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
                            ]}
                        }
                    },

1 个答案:

答案 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的答案。