【发布时间】:2020-07-08 10:21:16
【问题描述】:
我有一个 Mongo 集合 series,其中每个文档都有一个带有 dataPoints 的列表。 具有相同 testStepId 的所有 series 包含相同数量的 dataPoints:
{
"seriesId": {
"seriesId": "77678ca1-31db-4cec-a042-68a3053b92c6"
},
"testStepId": {
"testStepId": "c152415b-2392-4c2b-af74-51a4973bd257"
},
"measurement": {
"startTime": {
"$date": "2020-07-07T12:40:49.782Z"
},
"endTime": {
"$date": "2020-07-07T12:42:19.782Z"
}
},
"dataPoints": [
{
"timeStamp": {
"$date": "2020-07-07T12:41:09.782Z"
},
"value": "Value_1_1"
},
{
"timeStamp": {
"$date": "2020-07-07T12:41:29.782Z"
},
"value": "Value_1_2"
},
{
"timeStamp": {
"$date": "2020-07-07T12:41:39.782Z"
},
"value": "Value_1_3"
},
...
{
"timeStamp": {
"$date": "2020-07-07T12:42:19.782Z"
},
"value": "Value_2_11"
}
]
}
现在我想查询与特定 testStepId 匹配的所有 series 文档(没问题)。 但我不想加载所有找到的 series 中的所有 dataPoints,我只想加载 1000 个 dataPoints。 因此,如果找到 10 个 series,我只需为每个 series 加载 100 个 dataPoints:
-> 加载每 (dataPoints.size() / 100) 个数据点
-> 这意味着我必须考虑找到的 series 文档的计数和系列中 dataPoints 的计数
-> 加载每个 X-th dataPoint where
X = 1000 / <count of documents> / <count of dataPoints>
我正在努力通过与MongoDB Compass 的聚合来完成这项工作。但是我仍然无法计算找到的文档并取消此值...
从简单的开始,我只是尝试获取每第二个 dataPoint:
{
project: {
dataPoints: {
$map: {
input: { $range: [ 0, {"$size": "$dataPoints"}, 2 ] },
as: "index",
in: { $arrayElemAt: [ "$dataPoints", "$$index" ] }
}
}
}
}
-> 工作正常
现在我想根据找到的文档的数量来获取每个 x-th 'dataPoint' 依赖项。 为此我尝试了一些不同的方法,它们都不起作用......
- 尝试:使用 $count 而不是固定数字:
{
project: {
dataPoints: {
$map: {
input: { $range: [ 0, {"$size": "$dataPoints"}, $count ] },
as: "index",
in: { $arrayElemAt: [ "$dataPoints", "$$index" ] }
}
}
}
}
-> “项目规范必须是一个对象”
- 尝试:将count定义为变量:
{
project: {
dataPoints: {
$let: {
vars: {
total: "$count",
},
in: {
$map: {
input: { $range: [ 0, {"$size": "$dataPoints"}, "$$total"] },
as: "index",
in: { $arrayElemAt: [ "$dataPoints", "$$index" ] }
}
}
}
}
}
}
-> "$range 需要一个数值步骤,找到类型的值:missing"
显然我的方法是错误的。 任何人都可以给我一些提示如何让它工作吗?
【问题讨论】:
-
不应该是
X = <count of dataPoints> * <count of documents> / 1000吗? -
你是对的,谢谢。
标签: mongodb dictionary count let