Python MongoDB |根据一个字段逐个记录更新行记录
我想在python中使用基于时间范围的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
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行的结果合并)?我想一行一行地更新,就像第一条记录是它自身的温度值一样,然后第二条记录是第一行和第二行的结果,依此类推。。