Python MongoDB |根据一个字段逐个记录更新行记录

Python MongoDB |根据一个字段逐个记录更新行记录,python,python-3.x,mongodb,pymongo,pymongo-2.x,Python,Python 3.x,Mongodb,Pymongo,Pymongo 2.x,我想在python中使用基于时间范围的min/max/avg温度更新mongodb中集合的文档/记录 在下面的示例中,假设时间范围为“20:09-20:15”,则最后一行不会更新,其余行也会更新 样本数据: [ {'date': "1-10-2020", 'time': "20:09", 'temperature': 20}, //1 {'date': "1-10-2020", 'time': "20:11&q

我想在python中使用基于时间范围的
min
/
max
/
avg
温度更新mongodb中集合的文档/记录

在下面的示例中,假设时间范围为“20:09-20:15”,则最后一行不会更新,其余行也会更新

样本数据:

[
    {'date': "1-10-2020", 'time': "20:09", 'temperature': 20}, //1
    {'date': "1-10-2020", 'time': "20:11", 'temperature': 19}, //2 
    {'date': "1-10-2020", 'time': "20:15", 'temperature': 18}, //3
    {'date': "1-10-2020", 'time': "20:18", 'temperature': 18} //4
]
所需输出:

[
    {'date': "1-10-2020", 'time': "20:09", 'temperature': 20, 'MIN': 20, 'MAX': 20, 'AVG': 20}, //1
    {'date': "1-10-2020", 'time': "20:11", 'temperature': 19, 'MIN': 19, 'MAX': 20, 'AVG': 19.5}, //2
    {'date': "1-10-2020", 'time': "20:15", 'temperature': 18, 'MIN': 18, 'MAX': 20, 'AVG': 19}, //3
    {'date': "1-10-2020", 'time': "20:18", 'temperature': 18} //4
]

如果您使用的是Mongo 4.4+版,您可以使用以下命令来实现这一点:

db.collection.aggregate([
  {
    $match: {
      time: {
        $gte: "20:09",
        $lte: "20:15"
      }
    }
  },
  {
    $group: {
      _id: null,
      avg: {
        $avg: "$temperature"
      },
      min: {
        $min: "$temperature"
      },
      max: {
        $max: "$temperature"
      },
      root: {
        $push: "$$ROOT"
      }
    }
  },
  {
    $unwind: "$root"
  },
  {
    "$replaceRoot": {
      "newRoot": {
        "$mergeObjects": [
          "$root",
          {
            "MIN": "$min",
            "MAX": "$max",
            "AVG": "$avg"
          }
        ]
      }
    }
  },
  {
    $merge: {
      into: "collection",
      on: "_id",
      whenMatched: "replace"
    }
  }
])

如果您使用的是较小的Mongo版本,则必须将其拆分为2个调用,首先使用相同的
$group
阶段获取结果,然后使用要更新的值:(我将用python编写此调用,因为您标记了您正在使用的
pymongo


如果您使用的是Mongo 4.4+版,您可以使用以下命令来实现这一点:

db.collection.aggregate([
  {
    $match: {
      time: {
        $gte: "20:09",
        $lte: "20:15"
      }
    }
  },
  {
    $group: {
      _id: null,
      avg: {
        $avg: "$temperature"
      },
      min: {
        $min: "$temperature"
      },
      max: {
        $max: "$temperature"
      },
      root: {
        $push: "$$ROOT"
      }
    }
  },
  {
    $unwind: "$root"
  },
  {
    "$replaceRoot": {
      "newRoot": {
        "$mergeObjects": [
          "$root",
          {
            "MIN": "$min",
            "MAX": "$max",
            "AVG": "$avg"
          }
        ]
      }
    }
  },
  {
    $merge: {
      into: "collection",
      on: "_id",
      whenMatched: "replace"
    }
  }
])

如果您使用的是较小的Mongo版本,则必须将其拆分为2个调用,首先使用相同的
$group
阶段获取结果,然后使用要更新的值:(我将用python编写此调用,因为您标记了您正在使用的
pymongo


您好,谢谢您的回复,但是它会用max/min/value权限更新所有行(所有4行的结果都是相同的)?我想一行一行地更新,就像第一条记录是它自身的温度值一样,然后第二条记录是第一行和第二行的结果,依此类推..您好,谢谢您的回复,但它会用max/min/value对所有行进行更新(将所有4行的结果合并)?我想一行一行地更新,就像第一条记录是它自身的温度值一样,然后第二条记录是第一行和第二行的结果,依此类推。。