平均汇聚我在数据库中的记录如下:与字符串时间戳
{
"_id" : ObjectId("592d4f43d69b643ac0cb9149"),
"timestamp" : "2017-03-01 17:09:00",
"Technique-Meteo_Direction moyenne du vent_Mean value wind direction[]" : 0.0,
"Technique-Meteo_Précipitations_Precipitation status[]" : 0.0,
"Technique-Meteo_Direction du vent_Wind direction[]" : 0.0
}
{
"_id" : ObjectId("592d3a6cd69b643ac0cae395"),
"timestamp" : "2017-01-30 09:31:00",
"Technique-Electrique_Prises de Courant_Power1[W]" : 14.0,
"Technique-Electrique_Eclairage_Power2[W]" : 360.0,
"Technique-Electrique_Electroménager_Power3[W]" : 0.0,
"Technique-Electrique_VMC Aldes_Power4[W]" : 14.0,
"Technique-Electrique_VMC Unelvent_Power5[W]" : 8.0
我的时间戳是一个简单的字符串,我宁愿不要因为其他算法的变化量的触摸。 但是,我想做一些平均操作。事实上,其他领域的传感器名称与他们的测量。我每分钟都有一条记录,我希望在一小时,一天或一个月内平均这些值。
就在,我创建一个查询来算,每月现有值的数量对于一个场
countExistingPerMonth = client[page1.currentDB][page2.currentColl].find({"$and":[{"timestamp":{"$regex": regexExpression}}, {chosenSensor:{"$exists": True}}]}, temp_doc).count()
我用正则表达式$表达式查找选择一个月匹配的文档。
有什么办法可以用我这种方法做我的平均操作吗?
我试着做点什么(下面)。我也尝试使用正则表达式进行聚合,但这是不可能的。
self.sensorsStats = []
for chosenSensor in self.chosenSensors:
countPerMonth = []
years = []
incre_year = int(page5.combo_startYear.get())
if (incre_year<=int(page5.combo_endYear.get())):
while(incre_year!=(int(page5.combo_endYear.get())+1)):
years.append(str(incre_year))
incre_year += 1
for year in years:
for month in ["01","02","03","04","05","06","07","08","09","10","11","12"]:
regexExpression = '^'+year+'-'+month+'-..'
test = client[page1.currentDB][page2.currentColl].aggregate([{"$match":{"timestamp":{"$regex": regexExpression}}}, {"$group":{"_id":chosenSensor, "average":{"$avg":{chosenSensor}}}}])
感谢您的回答。子串的想法显然是我想要做的。因为我没有考虑这个问题,所以我试着用$ regex做类似的想法,例如每个值都是“2017-03”。但似乎$组不喜欢$正则表达式,或者我没有正确地做,我不知道。但是,我终于决定在我看到它不会像我想象的那么复杂之后,将我的时间戳(从字符串到日期格式)标准化。我一直关注你的最后一个提示,我想我完全不了解它,但我很快就会遇到相关问题。 –
@Clément使用BSON Date是更好的选择,我只是将它从答案中删除,因为您明确声明不想转换。但是,这很容易,因为字符串应该很简单地解析。虽然范围选择和“_id”组相同的基本概念基本适用。如前所述,“关键名称”对我来说似乎是一个更大的问题,可能会通过将它们移动到数组元素中的“值”来处理。但是,这取决于您是否在单个请求中写入多个邮件。但那是另一个练习,也许是另一个问题。 –