gpt4 book ai didi

MongoDB 聚合 - 文档数组中特定值的平均值

转载 作者:可可西里 更新时间:2023-11-01 10:51:25 24 4
gpt4 key购买 nike

我目前正在处理具有以下结构的数据库:

{"_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 米之间。

以下是从 1 月到 6 月所有深度的每个月平均温度的示例:

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 米之间的平均温度。

我一直在尝试按所需的深度对值进行分组,但没有成功 - 通常以错误的语法结束。此外,如果我没记错的话,$match 管道将返回所有深度,只要潜水具有 1 米和 4 米的值,所以这将不起作用。

通过 find() 工具,我使用 $slice 从数组中返回我想要的值 - 但与 aggregate() 函数一起使用时没有成功。

有办法解决吗?在此先感谢,非常感谢!

最佳答案

您需要将您的 $match 之前的管道$unwind optimize 你的聚合操作就像做一个 $unwind 对整个集合的操作可能会导致一些性能问题,因为它为每个数组条目生成每个文档的副本并且使用更多内存(聚合管道上可能的内存上限为总内存的 10%)因此需要“时间”产生扁平阵列以及“时间”来处理它。因此,最好限制进入要展平的管道的文档数量。

db.collection.aggregate([
{
"$match": {
"startdatetime": {
"$gt": new ISODate("2016-01-10T06:00:29Z"),
"$lt": new ISODate("2016-06-10T06:00:29Z")
},
"diveValues.depth": { "$gte": 1, "$lte": 4 }
}
},
{ "$unwind": "$diveValues" },
{ "$match": { "diveValues.depth": { "$gte": 1, "$lte": 4 } } },
{
"$group": {
"_id": {
"year": { "$year": "$startdatetime" },
"month": { "$month": "$startdatetime" }
},
"avgTemp": { "$avg": "$diveValues.temp" }
}
}
])

如果您希望结果包含所有深度和 1-4 深度范围的平均温度,那么您需要运行此管道,该管道将使用 $cond tenary operator to feed the $avg 根据深度范围对组内的累积温度进行运算:

db.collection.aggregate([
{
"$match": {
"startdatetime": {
"$gt": new ISODate("2016-01-10T06:00:29Z"),
"$lt": new ISODate("2016-06-10T06:00:29Z")
}
}
},
{ "$unwind": "$diveValues" },
{
"$group": {
"_id": {
"year": { "$year": "$startdatetime" },
"month": { "$month": "$startdatetime" }
},
"avgTemp": { "$avg": "$diveValues.temp" },
"avgTempDepth1-4": {
"$avg": {
"$cond": [
{
"$and": [
{ "$gte": [ "$diveValues.depth", 1 ] },
{ "$lte": [ "$diveValues.depth", 4 ] }
]
},
"$diveValues.temp",
null
]
}
}
}
}
])

关于MongoDB 聚合 - 文档数组中特定值的平均值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39849666/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com