gpt4 book ai didi

mongodb - 查找每个工具的值变化的日期

转载 作者:可可西里 更新时间:2023-11-01 09:32:46 24 4
gpt4 key购买 nike

我在 mongodb 集合中有一系列如下所示的命令:

id date       value
A 1 Jan 18 1
A 2 Jan 18 0
A 3 Jan 18 0
B 14 Jan 18 4
B 15 Jan 18 5
B 16 Jan 18 0

使用 mongodb 聚合管道(mongo 3.4),我试图找出每个 id,它的值在什么日​​期从非零变为 0,以及这些记录的“id 组”。

第二次更新:19年5月26日

我更新了问题以更清楚地说明第一个和最后一个实现的样子:

{
"$addFields": {
"date": {
"$dateFromString": {
"dateString": "$date"
}
}
}
},
{
$group: {
_id: {
"id": "$id",
"value": "$value"
},
"first": {
"$first": "$date"
},
"last": {
"$last": "$date"
}
}
},
{
"$match": {
"_id.value": 0
}
}

https://mongoplayground.net/p/moBRI2Q7aGu

这给了我:

id value   first      last
A 0 2 Jan 18 3 Jan 18
B 0 16 Jan 18 16 Jan 18

如果我查看“第一个”日期,那些是值首先从非零变为 0 的日期。

但是,我希望看到在某个时间点从非零变为 0 的那些值的整个“id 组”。所以:

id value   first      last
A 1 1 Jan 18 1 Jan 18
A 0 2 Jan 18 3 Jan 18
B 4 14 Jan 18 14 Jan 18
B 5 15 Jan 18 15 Jan 18
B 0 16 Jan 18 16 Jan 18

为了得到这个,我需要在上述管道的比赛之前进入小组赛阶段,所以https://mongoplayground.net/p/YTP-NBJtO4R ,并使用第一个聚合管道的结果集以某种方式对其进行过滤。我在 pandas 中通过第一个结果集的左连接来执行此操作,但这似乎不够优雅。

所以现在我有两个不同的管道,这似乎有点不方便。理想情况下,最后一个结果集将来自单个聚合管道。

最佳答案

您可以使用以下聚合

db.collection.aggregate([
{ "$addFields": {
"date": { "$dateFromString": { "dateString": "$date" }}
}},
{ "$sort": { "date": 1 }},
{ "$match": { "value": 0 }},
{ "$group": {
"_id": "$id",
"date": { "$first": "$date" },
"value": { "$first": "$value" }
}}
])

MongoPlayground

更多的聚合技巧

db.collection.aggregate([
{ "$match": { "value": "0" }},
{ "$addFields": {
"date": { "$dateFromString": { "dateString": "$date" }}
}},
{ "$sort": { "date": 1 }},
{ "$group": {
"_id": "$id",
"data": {
"$push": {
"value": "$value",
"date": "$date"
}
}
}},
{ "$project": {
"data": {
"$arrayElemAt": [
{ "$filter": {
"input": "$data",
"cond": { "$eq": ["$$this.value", "0"] }
}},
0
]
}
}},
{ "$replaceRoot": {
"newRoot": { "$mergeObjects": [{ "id": "$_id" }, "$data"] }
}}
])

如果您的文档已经包含日期格式的日期而不是上面显示的方式,您可以删除第一阶段 $addFields

MongoPlayground

关于mongodb - 查找每个工具的值变化的日期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56201148/

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