我目前正在对数据库具有以下结构数组:MongoDB的合计 - 平均特定值的文件
{"_id" : ObjectId("1abc2"),
"startdatetime" : ISODate("2016-09-11T18:00:37Z"),
"diveValues" : [
{
"temp" : 15.269,
"depth" : 0.0,
},
{
"temp" : 14.779257384,
"depth" : 1.0,
},
{
"temp" : 14.3940253165,
"depth" : 2.0,
},
{
"temp" : 13.9225795455,
"depth" : 3.0,
},
{
"temp" : 13.8214431818,
"depth" : 4.0,
},
{
"temp" : 13.6899553571,
"depth" : 5.0,
}
]}
该数据库拥有约深度n米水信息,并给出温度深度。这存储在“diveValues”数组中。我在平均日期之间的所有深度方面取得了成功,包括月平均值和日平均值。我遇到的一个严重问题是,在过去6个月的每个月中,平均数在1到4米之间。
这里是平均温度为每月从一月到六月的一个例子,对所有的深度:
db.collection.aggregate(
[
{$unwind:"$diveValues"},
{$match:
{'startdatetime':
{$gt:new ISODate("2016-01-10T06:00:29Z"),
$lt:new ISODate("2016-06-10T06:00:29Z")}
}
},
{$group:
{_id:
{ year: { $year: "$startdatetime" },
month: { $month: "$startdatetime" }},
avgTemp: { $avg: "$diveValues.temp" }}
},
{$sort:{_id:1}}
]
)
,导致:
{ "_id" : { "year" : 2016, "month" : 1 }, "avgTemp" : 7.575706502958313 }
{ "_id" : { "year" : 2016, "month" : 3 }, "avgTemp" : 6.85037457740135 }
{ "_id" : { "year" : 2016, "month" : 4 }, "avgTemp" : 7.215702831902588 }
{ "_id" : { "year" : 2016, "month" : 5 }, "avgTemp" : 9.153453683614638 }
{ "_id" : { "year" : 2016, "month" : 6 }, "avgTemp" : 11.497953009390237 }
现在,我似乎无法弄清楚如何在同一时期获得1至4米的平均温度。
我一直试图按想要的深度对值进行分组,但没有管理它 - 更多的时候是以不好的语法结束。此外,如果我没有错,只要潜水的值为1米和4米,$匹配管道就会返回所有深度,这样就不会起作用。使用find()工具我使用$ slice从数组中返回我想要的值 - 但没有成功与aggregate()函数一起使用。
有没有办法解决这个问题?在此先感谢,非常感谢!
非常感谢,解决了这个问题。并且非常感谢您在放松之前放置比赛的提示。 – Vegar
@Vegar不用担心。出于好奇,你最终使用了哪条管线,第一条还是最后一条? – chridam
为了我的需要,第一个最适合我。但是我非常感谢你们写了这两本书,因为我觉得它很有教育意义。 – Vegar